我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈
异常捕获
- 异常捕获
- 异常捕获语法结构
- 方案1:try...except...else...finally...
- 方案二:with语句
异常捕获
异常捕获语法结构
方案1:try…except…else…finally…
- 语法结构
try可能出现异常的代码# (这里不管会抛出多少个异常,从上往下检测,检测到一个就立即往下去匹配,不会多次检测) except 要捕获的异常类别1 as 接收异常的形参1:对这个异常进行处理1 except 要捕获的异常类别2 as 接收异常的形参2:对这个异常进行处理2 . . . except 要捕获的异常类别n as 接收异常的形参n:对这个异常进行处理n [else:没出现异常时做的处理] [finally不管有没有出现异常,都会执行这一部分代码]# except 要捕获的异常类别 as 接收异常的形参: # 这一句在Python2.x版本中可以用","替换语句中的as # 但是Python3.x版本不能再用",",只能使用as
- 注意:
try语句
没有捕获到异常,先执行try
代码段,再执行else
,最后执行finally
- 如果
try语句
捕获到异常,先执行except
处理错误,再执行finally
- 如果异常名称不确定,有想要捕捉,可以直接写
Exception
- 示例
# 写法一 try:# 1 / 0print(name) except ZeroDivisionError as e:print('出现除零异常', e) except NameError as e:print('出现名称异常', e) else:print('么有出现异常') finally:print('不管是否有异常,都执行')# 写法二 try:# 1 / 0print(name) except (ZeroDivisionError, NameError) as e: # try部分捕获到的异常类型到这个元组里面进行循环查找print('出现了异常', e) else:print('么有出现异常') finally:print('不管是否有异常,都执行')# 写法三 # 写法二 try:# 1 / 0print(name) except Exception as e:print('出现了异常', e) else:print('么有出现异常') finally:print('不管是否有异常,都执行')
方案二:with语句
-
with 语句用于异常处理,封装了
try…except…finally
编码范式,提高了易用性 -
作用
- 适用于执行某一段代码A之前进行预处理,执行代码A结束后,进行清理操作。不管出现了什么异常,最终都要执行一些清理操作
- 比如:文件操作
with open(file) as f
语句,不管是否抛出异常,都会自动执行f.close()
关闭文件
-
语法
with context_expression [as target(s)]:with-body# context_expression # 上下文表达式 # with-body # 语句体# 上下文表达式:要求必须要返回一个“上下文管理器”的表达式 # 上下文管理器:实现了“上下文协议”的对象 # 上下文协议:必须要实现`__enter__()`(进入)方法和`__exit__()`(退出)方法
-
执行流程
1、context_expression上下文表达式要返回一个上下文管理器对象 2、调用“上下文管理器”的__enter__()方法 3、如果写了as target语句,则把__enter__()方法的返回值赋值给target 4、执行 语句体 5、执行“上下文管理器”的__exit__()方法
-
with语句示例
-
示例前提解析
# 文件读取操作正常步骤# 1、打开文件 f = open('xxxx.xx')# 2、读取文件 f.readlines() ---> 如果这一行代码抛出异常,就会影响后续“文件关闭”操作的执行# 3、关闭文件 f.close()
- 整个文件操作步骤中,如果读取文件操作抛出异常,则会影响后续的文件关闭操作,导致文件无法关闭
- 于是,我们想保证,不管读取文件有没有异常,都要关闭文件
-
使用
try...except
语句解决try:打开文件读取文件 except Exception:异常处理 finally:关闭文件
- 使用
try...except
语句解决写法过于繁琐,如果有几十个文件操作,就要写几十遍try...except
语句
- 使用
-
使用
with
语句解决with open(file) as f:读取文件# open(file) 是上下文表达式,会返回一个“上下文管理器” # 执行“上下文管理器”的__enter__()方法 # 将__enter__()方法的返回值(文件对象)赋值给f # 执行 读取文件 操作 # 执行“上下文管理器”的__exit__()方法(在__exit__()方法内封装了文件关闭操作)
-
with语句问题点
-
上述代码中并不能捕获异常也没有做异常处理,仅仅是做了自动的文件关闭操作
-
要捕获异常,就要给读取文件操作套上try语句
with open(file) as f:try:读取文件except Exception:print('捕获异常,异常处理')
-
要捕获异常,也可以通过自定义上下文管理器来捕获