98. Python基础教程:try...except...finally语句

【目录】

文章目录

    • 1. try...except...finally语法介绍
    • 2. try...except...finally执行顺序
    • 3. 捕获特定类型的异常
    • 4. 捕获所有类型的异常
    • 5. 实操练习-打开txt文件并输出文件内容

【正文】

在今天的课程中,我们将学习Python中的异常处理语句try...except...finally

try...except...finally是Python中的一个异常处理语句。

try...except...finally语句的作用是捕获和处理程序中的异常。

1. try…except…finally语法介绍

try[traɪ]:尝试。

except[ɪkˈsept]:把…排除在外。

finally [ˈfaɪnəli]:最后。

【基本语法】

try:# 可能会引发异常的代码块
except ExceptionType1:# 异常类型1的处理代码块
except ExceptionType2:# 异常类型2的处理代码块
...
finally:# 无论是否发生异常,都会执行的代码块

2. try…except…finally执行顺序

  • try代码块中,我们放置可能会引发异常的代码。

  • 如果try代码块中的代码引发了异常,那么程序会跳转到对应的except代码块进行处理。

  • 如果try代码块中代码没有引发异常,那么程序执行try代码块中的代码,except代码块将会被忽略。

  • except代码块可以有多个,每个except代码块用于处理不同类型的异常。

  • 我们可以根据具体的需求,选择捕获和处理特定类型的异常。

  • 无论是否发生异常,finally代码块中的代码最终都会被执行。

  • finally代码块通常用于关闭文件、释放数据库连接或进行一些清理操作。

  • 它的作用是避免资源泄露和内存溢出等问题,从而提高程序的健壮性。

下面,我们通过一些案例来讲解try...except...finally语句的应用。

3. 捕获特定类型的异常

【代码示例:98-1】

try:# 可能会出现异常的代码x = int(input("请输入第1个整数: "))y = int(input("请输入第2个整数: "))result = x / yprint("结果是:", result,'\n')
except ValueError as e:# 处理值错误异常print("输入的不是整数,请重新输入。", e,'\n')
except ZeroDivisionError as e:# 处理除零异常print("除数不能为零,请重新输入。", e,'\n')
except Exception as e:# 处理其他异常print("发生了一个异常:", e,'\n')
finally:# 无论是否发生异常,都会执行的代码print("程序结束。",'\n')

在上面的代码中,我们尝试将用户输入的两个整数相除,并打印结果。

如果用户输入的不是整数,会捕获到值错误异常,并输出提示信息。

如果用户输入的除数为零,会捕获到除零异常,并输出相应的提示信息。

如果发生其他类型的异常,会捕获到通用的异常,并输出异常信息。

注意无论是否发生异常,最后都会执行finally块中的代码,输出程序结束的提示信息。

【终端输出】

在这里插入图片描述

【温馨提示】

'\n'是一个转义字符,表示换行符。它的作用是在输出中增加一个空行。

我是为了写笔记时框选内容方便而加的换行符,大家可以省略换行符。

【错误代码示例:98-2】

为了输出结果更加清晰易读,我想给input语句也增加一个换行功能。

我想在下面每个输入语句代码后面增加了一个'\n':

x = int(input("请输入第1个整数: "))
y = int(input("请输入第2个整数: "))

增加后的代码如下所示:

x = int(input("请输入第1个整数: ",'\n'))
y = int(input("请输入第2个整数: ",'\n'))

【错误完整代码示例:98-2】

try:# 可能会出现异常的代码x = int(input("请输入第1个整数: ",'\n'))y = int(input("请输入第2个整数: ",'\n'))result = x / yprint("结果是:", result,'\n')
except ValueError as e:# 处理值错误异常print("输入的不是整数,请重新输入。", e,'\n')
except ZeroDivisionError as e:# 处理除零异常print("除数不能为零,请重新输入。", e,'\n')
except Exception as e:# 处理其他异常print("发生了一个异常:", e,'\n')
finally:# 无论是否发生异常,都会执行的代码print("程序结束。",'\n')

我们来看程序运行的结果。

【终端输出】

在这里插入图片描述

expected [ɪkˈspektɪd] :预期。

at most :至多。

arguments [ˈɑːgjʊmənts]:参数。

运行代码,程序发生input expected at most 1 argument, got 2异常。

报错信息" input expected at most 1 arguments, got 2"表示调用函数时只需要传递1个参数,但是在代码中却传递了两个参数。

x = int(input("请输入第1个整数: ",'\n'))

注意:输入函数input()只能传递一个参数.

但上面的代码中有2个参数,一个是"请输入第1个整数: ",另一个是'\n'

因为多输入了一个'\n',所以程序报错。

4. 捕获所有类型的异常

在不确定可能发生的异常种类的的情况下,我们可以使用Exception来捕获任意类型的异常。

【代码示例:98-3】

try:num = int(input("请输入一个整数:"))result = 10 / numprint("结果为:", result)
except Exception as e:print("发生了异常:", e)
finally:print("程序执行完毕。")

【终端输出】

在这里插入图片描述

【Exception和BaseException的区别】

  • Exception和BaseException是Python中的异常类。

  • Exception是所有异常类的基类,而BaseException是Exception的父类。

  • Exception类是Python中所有内置异常类的基类,它包含了常见的异常情况,如ZeroDivisionError、TypeError等。我们可以使用try-except语句来捕获并处理这些异常。

  • BaseException类是Exception的父类,它是所有内置异常类的根源。它包含了一些特殊的异常情况,如SystemExit、KeyboardInterrupt等。这些异常通常是由Python解释器或操作系统引发的,而不是由我们的代码引发的。因此,我们无法使用try-except语句来捕获不是代码引发的异常。

  • 总的来说,Exception是用于捕获和处理常见异常的基类,而BaseException是用于捕获和处理特殊异常的父类。在编写代码时,我们通常使用Exception来捕获和处理异常,而不需要直接使用BaseException。

5. 实操练习-打开txt文件并输出文件内容

【目标任务】

编写一个程序,要求用户输入一个文件名,然后尝试打开该文件并读取其中的内容。

如果文件不存在,捕获异常并输出错误提示信息,最后用finally关闭文件。

【准备工作】

新建一个联系方式.txt文件,文件内容如下:

安迪python学习笔记
xyz77520520

文件存储的绝对路径如下:

D:\安迪笔记\1.基础语法\98\联系方式.txt

我用的vscode编辑器,编辑器打开的文件夹是【安迪笔记】,因此联系方式.txt文件的相对路径如下:

1.基础语法\98\联系方式.txt

67. Python的绝对路径

68. Python的相对路径

vscode编辑器也可以快速查看文件的路径,具体参考上面的笔记。

【安迪碎碎念】

我在编写代码时,如果题目要求写输入语句,我起初都会省略输入语句,而是先采取赋值的方式来完成代码。

这样做的好处是如果代码有异常,可以快速的查找错误,避免在终端输入时浪费过多时间,且很多新手终端输入时更容易出错。

【代码示例:98-4】

我先省略输入语句。

try:file = open('1.基础语法\98\联系方式.txt', 'r', encoding="utf-8")content = file.read()print(content)
except Exception as e:print("发生了异常:", e)
finally:file.close()print("文件已关闭!")

【终端显示】

在这里插入图片描述

我们添加上输入语句:

【代码示例:98-5】

try:filename = input("请输入文件名:")print('\n')file = open(filename, 'r', encoding="utf-8")content = file.read()print(content)
except Exception as e:print("发生了异常:", e,'\n')
finally:file.close()print("文件已关闭!")

当我在终端输入联系方式.txt时,终端显示如下图所示:

【终端输出】

在这里插入图片描述

【报错解析】

[Errno 2] No such file or directory: 'filename ' 意思是没有这样的文件或目录。

当出现报错[Errno 2] No such file or directory: 'filename'时,通常是因为指定的文件或目录不存在。

这个错误可能有几种可能的原因:

  • 首先,可能是文件或目录的路径不正确,即文件或目录不存在于指定的路径中。

  • 其次,可能是文件或目录的权限设置不正确,导致无法访问。

  • 最后,可能是文件或目录被误删或移动到其他位置。

这里是因为我们输入的不是文件正确的路径,因此程序报错。

NameError: name 'file' is not defined意思是在代码中使用了一个未定义的变量或函数名file

这个错误是因为在finally块中,file变量没有定义。

这是因为在try块中的代码发生了异常,程序没有执行完try块中的代码,因此file变量就没有被定义。

然后程序执行except块中的语句,输出异常原因。

最后,程序执行finally块的file.close()时,因为file变量就没有被定义,所以程序报错输出NameError: name 'file' is not defined

只要我们输入正确的路径,程序就能正常输出了。

运行程序,在终端输入1.基础语法\98\联系方式.txt

在这里插入图片描述

【代码解析】

try:filename = input("请输入文件名:")print('\n')file = open(filename, 'r', encoding="utf-8")content = file.read()print(content)
except Exception as e:print("发生了异常:", e,'\n')
finally:file.close()print("文件已关闭!")

总体框架使用try-except-finally结构来处理异常。

filename = input("请输入文件名:")

第2行:提示用户输入文件名,并将输入的文件名赋值给变量filename,注意这里要输入的文件名是文件的绝对路径或相对路径。

如果你只想输入文件的名称联系方式.txt作为文件的相对路径,那你可以将.py文件和.txt文件存储在同一个文件夹里,并且用vscode编辑器直接打开该文件夹,这样文件名就是文件的相对路径了。

print('\n')

第3行:打印一个换行符。

file = open(filename, 'r', encoding="utf-8")

第4行:使用open()函数以只读模式打开文件,指定编码为utf-8,并将打开的文件对象赋值给变量file。

open函数语法回顾

open(filename, mode, encoding)
  • filename:要打开的文件名(包括路径)。
  • mode:打开文件的模式,可以是 'r'(只读模式,默认值)、'w'(写入模式,会覆盖文件中的内容)、'a'(追加模式,在文件末尾添加内容)等。
  • encoding:指定文件的编码方式,默认为 None,表示使用系统默认编码。常用的编码方式有 'utf-8''gbk' 等。
content = file.read()

第5行:使用read()方法读取文件的全部内容,并将内容赋值给变量content。

read()方法是文件对象的一个方法,用于读取文件的内容。

它没有参数,调用该方法会将整个文件的内容读取出来,并返回一个字符串。

read()方法语法回顾

file.read()

file是一个文件对象,可以通过open()函数打开一个文件获得该文件对象。

read是方法名。

read()方法会从文件的当前位置开始读取内容,读取到文件末尾时停止。

读取的内容会以字符串的形式返回,并赋值给变量content。

print(content)

第6行:打印文件的内容。

except Exception as e:

第7行:捕获异常,并将异常对象赋值给变量e。

print("发生了异常:", e,'\n')

第8行:输出异常内容。

finally:

第9行:finally块中的代码始终会执行,无论是否发生异常。

file.close()

第10行:关闭文件。

print("文件已关闭!")

第11行:打印提示信息,表示文件已关闭。

【错误代码示例】

try:filename = input("请输入文件名:")print('\n')file = open(`filename`, 'r', encoding="utf-8")content = file.read()print(content)
except Exception as e:print("发生了异常:", e,'\n')
finally:file.close()print("文件已关闭!")

上面的代码是错误,不管你在终端输入什么,程序都会报错。

这也是很多同学容易犯的错误,有兴趣的同学找找看错误在哪里吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle也有回收站

在数据库管理中,数据的删除是一个常见的操作。然而,有时候我们可能会意外地删除了一些重要的数据。幸运的是,Oracle数据库提供了一个类似于回收站的功能,可以帮助我们恢复被删除的数据。本文将介绍Oracle数据库中的回收站功能以及…

深度学习实际使用经验总结

以下仅是个人在使用过程中的经验总结,请谨慎参考。 常用算法总结 图像分类 常用算法(可作为其他任务的骨干网络):服务端:VGG、ResNet、ResNeXt、DenseNet移动端:MobileNet、ShuffleNet等适用场景&#x…

如何使用fiddler进行抓包

首先需要下载fiddler,推荐使用bing搜索引擎搜索(百度搜狗一般搜这种工具展示的前几个全都是广告),直接搜索fiddler,搜出来第一个fiddler官网 然后直接点击download下载 进入下载页面后,正确填写一个邮箱&a…

linux 动态库so相关操作

1. 查看库版本号 一般在文件名上有版本号,若文件名上没有版本号,使用如下命令查看: readelf -d libstdc.so 2. 查看库内函数 a) nm -d libstdc.so | grep 内容 b) objdump -tT libstdc.so | grep 内容 c) readelf -s libstdc.so | grep…

通用版Bubble_sort

❤博主CSDN:啊苏要学习 ▶专栏分类:C语言◀ C语言的学习,是为我们今后学习其它语言打好基础,C生万物! 开始我们的C语言之旅吧!✈ 目录 前言: 一.分析Bubble_sort 二.解决措施 三.模拟实现 前言&#xff…

【数据结构】带头+双向+循环链表(DList)(增、删、查、改)详解

一、带头双向循环链表的定义和结构 1、定义 带头双向循环链表,有一个数据域和两个指针域。一个是前驱指针,指向其前一个节点;一个是后继指针,指向其后一个节点。 // 定义双向链表的节点 typedef struct ListNode {LTDataType dat…

java判断字符串是否和空字符串(““)相等、是否和空引用(null)相等,比较顺序不同导致出现死代码(Dead code)

我在用Java实现需求的时候,用到了字符串跟空字符串(“”)比较,跟空引用null比较,两个比较语句的顺序不同,一个顺序出现了死代码(Dead code)。 下面这个代码片段,字符串li…

探秘二叉树后序遍历:从叶子到根的深度之旅

本篇博客会讲解力扣“145. 二叉树的后序遍历”的解题思路,这是题目链接。 本题的思路是: 先创建一个数组,用来存储二叉树后序遍历的结果。数组的大小跟树的结点个数有关。树的结点个数可以使用递归实现,即总个数左子树结点个数右…

如何将单体项目拆分成微服务

1、如何将单体项目拆分成微服务 如何拆分微服务?其实对不同的业务项目场景,对应有不同的拆分方案。需要项目人员详细的分析项目需求、团队现状、业务边界、业务逻辑等方方面面,拆分的粒度既不能过细,也不能过粗,需要把…

图像 检测 - FCOS: Fully Convolutional One-Stage Object Detection (ICCV 2019)

FCOS: Fully Convolutional One-Stage Object Detection - 全卷积一阶段目标检测(ICCV 2019) 摘要1. 引言2. 相关工作3. 我们的方法3.1 全卷积一阶目标检测器3.2 FCOS的FPN多级预测3.3 FCOS中心度 4. 实验4.1 消融研究4.1.1 FPN多级预测4.1.2 有无中心度…

Gis入门,根据起止点和一个控制点计算二阶贝塞尔曲线(共三个控制点组成的线段转曲线)

前言 本章讲解如何在gis地图中使用起止点和一个控制点(总共三个控制点)生成二阶贝塞尔曲线。 三阶贝塞尔曲线请参考下一章《Gis入门,使用起止点和两个控制点生成三阶贝塞尔曲线(共四个控制点)》 贝塞尔曲线(Bezier curve)介绍 贝塞尔曲线(Bezier curve)是一种数学…

Nim游戏博弈论

【模板】nim 游戏 题目描述 https://www.luogu.com.cn/problem/P2197 甲,乙两个人玩 nim 取石子游戏。 nim 游戏的规则是这样的:地上有 n n n 堆石子(每堆石子数量小于 1 0 4 10^4 104),每人每次可从任意一堆石子…

GDAL C++ API 学习之路 OGRGeometry 线类 OGRLineString

OGRLineString class "ogr_geometry.h" OGRLineString 类是 OGR 库中的一个几何对象类,用于表示线段或折线。它由多个坐标点组成,并且在坐标点之间形成线段。OGRLineString 可以包含 2D、3D 或 3DM 坐标点,其中 M 表示额外…

前端-mac初始化配置

新电脑设置: Mac三指拖动:https://support.apple.com/zh-cn/HT204609 选取苹果菜单  >“系统设置”(或“系统偏好设置”)。点按“辅助功能”。点按“指针控制”(或“鼠标与触控板”)。点按“触控板选…

ISO 7637-2 5a/5b抛负载测试保护用TVS二极管,如何选型号?

在国际标准ISO 16750-2颁布之前,全球各大汽车零部件制造商一直采用的是ISO 7637-2标准。ISO 16750-2国际标准发行之后,汽车抛负载浪涌测试中ISO 7637-2 5A和5B测试标准被ISO 16750-2测试标准取代。查看ISO 16750-2和ISO 7637-2国际标准文档资料对比会发现…

13个ChatGPT类实用AI工具汇总

在ChatGPT爆火后,各种工具如同雨后春笋一般层出不穷。以下汇总了13种ChatGPT类实用工具,可以帮助学习、教学和科研。 01 / ChatGPT for google/ 一个浏览器插件,可搭配现有的搜索引擎来使用 最大化搜索效率,对搜索体验的提升相…

多线程(JavaEE初阶系列6)

目录 前言: 1.什么是线程池 2.标准库中的线程池 3.实现线程池 结束语: 前言: 在上一节中小编带着大家了解了一下Java标准库中的定时器的使用方式并给大家实现了一下,那么这节中小编将分享一下多线程中的线程池。给大家讲解一…

MySQL主从复制配置

Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。 (1)首先确保主从服务器上的Mysql版本相同 (2)在主服务器上,创建一个充许从数据库来访问的用户slave,密码为:123456 ,然后使用REPLICATION SLAV…

NoSQL-Redis集群

NoSQL-Redis集群 一、集群:1.单点Redis带来的问题:2.解决:3.集群的介绍:4.集群的优势:5.集群的实现方式: 二、集群的模式:1.类型:2.主从复制: 三、搭建主从复制&#xff…

在CentOS 7上挂载硬盘到系统的步骤及操作

目录 1:查询未挂载硬盘2:创建挂载目录3:检查磁盘是否被分区4:格式化硬盘5:挂载目录6:检查挂载状态7:设置开机自动挂载总结: 本文介绍了在CentOS 7上挂载硬盘到系统的详细步骤。通过确…