目录
3.4 except type as identifier:、except (type1,type2,*) as identifier:
1. 基础格式
try语句捕获异常,语法结构如下:
#try-except-else/finally语句
try:
suite
except [expression [as identifier]]:
suite
[except [expression [as identifier]]:
suite]*
[else:
suite]
[finally:
suite]
#try-finally语句
try:
suite
finally:
suite
解释如下:
#try-except-else/finally语句
try:
检测范围
except [异常类型 [as 异常实例]]:
异常处理代码
[except [异常类型 [as 异常实例]]:
异常处理代码]*
[else:
没有触发异常时执行的代码]
[finally:
收尾工作执行代码]
#try-finally语句
try:
检测范围
finally:
收尾工作执行代码
2. try 结构的子句
try 捕获异常包括 except、else、finally 等几种子句,格式和描述如下表:
| 子句 | 描述 |
| except: | 捕捉所有(或所有其他)异常 |
| except type: | 仅捕捉符合 type 的异常 |
| except type as identifier: | 捕捉异常及其实例 |
| except (type1,type2,*): | 捕捉多种类型的异常 |
| except (type1,type2,*) as identifier: | 捕捉托中类型的异常及其实例 |
| else: | 如果没有异常发出则执行 |
| finally: | 无论是否发生异常都执行的收尾 |
try 必须带有一个 except 或 finally语句,或者两个都带,else 为可选;
可以有零个或多个 except 语句,但如果有 else 语句,则至少有一个 except 语句;
几种子句的顺序必须是:try -> except -> else -> finally。
3. except 子句
except 子句几种格式实操如下:
3.1 except:
基础的 try-except 语法结构说明如下:
try:
检测范围
except:
出现异常(exception)后的处理代码
针对 try suite 检测范围内的语句,如出现异常,则执行 except suite 后的处理代码,且程序执行不中断;
这样可以避免Python直接报错并中断程序操作,给与程序员更多选择;
直接使用 except 语句会捕获所有异常并统一执行处理代码,可能使得程序员未曾预想到的异常无法被及时发现,需要谨慎使用。
#执行代码
try:
f = open('不存在的文件.txt')
except:
print('打开文件失败')
print('报错后,仍可继续执行其余代码!')
#返回结果
打开文件失败
报错后,仍可继续执行其余代码!
3.2 except type:
type 即异常类型,用于对异常做筛选;
type 未赋值时,try suite 执行出现的所有异常,都会使得 except suite 得以执行;
type 赋值时,try suite 执行出现的异常,属于 type 给出的异常类型或子类,才会使得 except suite 得以执行。
#type 未赋值时,try suite 执行出现的所有异常,都会使得 except suite 得以执行
try:
f = open('不存在的文件.txt')
except:
print('打开文件失败')
打开文件失败
#type 赋值时,try suite 执行出现的异常,属于 type 给出的异常类型或子类,except suite 得以执行。
try:
f = open('不存在的文件.txt')
except FileNotFoundError:
print('打开文件失败')
打开文件失败
#try suite 执行出现的异常,不属于 type 给出的异常类型或子类,except suite 不执行,直接报错
try:
f = open('不存在的文件.txt')
except FileExistsError:
print('打开文件失败')
Traceback (most recent call last):
File "<input>", line 2, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '不存在的文件.txt'
3.3 except (type1,type2,*):
可以通过该语句中多个异常类型的元组,同时捕捉多种类型的异常;
需要注意的是,try suite 中第一个异常不在异常类型元组中时,即使后续存在的异常符合条件,仍会导致程序直接跳出报错。
#使用异常类型元组,对多种类型异常进行捕捉
try:
1/0
f = open('不存在的文件.txt')
except (ZeroDivisionError,FileNotFoundError):
print('打开文件失败')
打开文件失败
try:
f = open('不存在的文件.txt')
1/0
except (ZeroDivisionError,FileNotFoundError):
print('打开文件失败')
打开文件失败
#第一个异常不在异常类型元组中时,即使后续存在的异常符合条件,仍会导致程序直接跳出报错
try:
1/0
f = open('不存在的文件.txt')
except (FileExistsError,FileNotFoundError):
print('打开文件失败')
Traceback (most recent call last):
File "<input>", line 2, in <module>
ZeroDivisionError: division by zero
3.4 except type as identifier:、except (type1,type2,*) as identifier:
as identifier,将try suite 执行出现的符合类型的异常具体信息,赋值给 identifier;
as identifier 前必须有异常类型,不可单独使用,否则报错;
identifier 仅可用于 except suite,try-except语句执行完成后再次调用,则失败报错。
#except type as identifier: 执行后返回异常具体信息
try:
f = open('不存在的文件.txt')
except OSError as error1:
print('打开文件失败')
print(error1)
打开文件失败
[Errno 2] No such file or directory: '不存在的文件.txt'
#except (type1,type2,*) as identifier: 执行后返回异常具体信息
try:
1/0
except (OSError,ZeroDivisionError) as error1:
print('打开文件失败')
print(error1)
打开文件失败
division by zero
#as identifier 前没有异常类型,报错
try:
1/0
except as error1:
print('打开文件失败')
print(error1)
File "<input>", line 3
except as error1:
^
SyntaxError: invalid syntax
#try-except语句执行完成后再次调用 identifier,失败报错。
try:
f = open('不存在的文件.txt')
except OSError as error1:
print('打开文件失败')
打开文件失败
print(error1)
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'error1' is not defined
3.5 多条except子句
try 语句后,可以搭配多条 except 子句,实现对不同类型异常的分别捕捉和处理;
try suite 出现第一个异常后,即检查各条 except 子句,如异常符合其中某条 except 子句 expression,即完成缺陷捕捉,跳出 try 语句;try suite 后续代码及其余 except 子句 不予执行;
异常同时满足多条 except 子句异常类型设置,按从上到下顺序满足条件的第一条 except 子句异常处理代码执行。
#try suite 出现第一个索引错误异常,按照符合要求 except 子句后续异常处理代码执行
#try suite 后续代码及其余 except 子句 不予执行;
try:
s = ['a','b','c']
s[3]
1 / 0
f = open('不存在的文件.txt')
except ZeroDivisionError as error1:
print(error1)
except IndexError as error2:
print(error2)
except FileNotFoundError as error3:
print(error3)
list index out of range
#异常同时满足多条 except 子句,按从上到下顺序满足条件的第一条 except 子句异常处理代码执行
try:
f = open('不存在的文件.txt')
except ZeroDivisionError as error1:
print(error1)
except OSError as error2:
print('于 except OSError 子句返回',error2)
except FileNotFoundError as error3:
print('于 except FileNotFoundError 子句返回',error3)
于 except OSError 子句返回 [Errno 2] No such file or directory: '不存在的文件.txt'
4. else 子句
try suite 执行时未出现异常,则执行 else suite;
else 子句前必须有 except 子句,否则报错。
#try suite 执行时未出现异常,则执行 else suite
try:
f = open('.\\测试文件\\test.txt')
except:
print('出错咯!')
else:
print('没问题!')
没问题!
#else 子句前必须有 except 子句,否则报错
try:
f = open('不存在的文件.txt')
else:
File "<input>", line 3
else:
^
SyntaxError: invalid syntax
5. finally 子句
无论 try suite 执行时有无异常,都会执行 finally suite;
finally 前可以没有 except 子句,用于提供无论 try suite 是否因为异常跳出,都可以保证执行的收尾语句;譬如 try suite 中包括打开文件,则可以通过 finally suite提供关闭文件,实现类似上下文管理器的功能,保证异常发生前的文件修改被存储;
对于 try - except -finally 结构来说,如果 try suite 无异常,则跳过 except 子句,执行 finally suite;如果 try suite 发生异常,则先执行 except suite,再执行 finally suite。
#finally 前可以没有 except 子句,用于提供无论 try suite 是否因为异常跳出,都可以保证执行的收尾语句
try:
f = open('.\\测试文件\\test.txt','w+')
f.write('abc')
1/0
f.write('123')
finally:
f.close()
Traceback (most recent call last):
File "<input>", line 4, in <module>
ZeroDivisionError: division by zero
#异常前的文件修改被保存
f = open('.\\测试文件\\test.txt','r+')
f.read()
'abc'
#try suite 无异常,跳过 except 子句,执行 finally suite
try:
0/1
except:
print('异常捕捉!')
finally:
print('程序收尾!')
程序收尾!
#try suite 发生异常,先执行 except suite,再执行 finally suite
try:
1/0
except:
print('异常捕捉!')
finally:
print('程序收尾!')
异常捕捉!
程序收尾!
6. try 语句的嵌套
try 语句也支持嵌套操作;
内层 try 语句中异常未被捕捉,被外层 try 语句捕捉;
内层 try 语句 try suite 中异常被捕捉后,内层 try 语句不再被视为异常,不会被外层 try 语句再次捕捉。
#内层 try 语句中异常未被捕捉,被外层 try 语句捕捉
try:
print('嵌套try语句!')
try:
1/0
except FileExistsError as error1:
print(error1)
finally:
print('嵌套try语句结束!')
f = open('不存在的文件.txt')
except ZeroDivisionError as error2:
print(error2)
finally:
print('执行完毕!')
嵌套try语句!
嵌套try语句结束!
division by zero
执行完毕!
#内层 try 语句 try suite 中异常被捕捉后,内层 try 语句不再被视为异常,不会被外层 try 语句再次捕捉
try:
print('嵌套try语句!')
try:
1/0
except ZeroDivisionError as error1:
print(error1)
finally:
print('嵌套try语句结束!')
f = open('不存在的文件.txt')
except FileNotFoundError as error2:
print(error2)
finally:
print('执行完毕!')
嵌套try语句!
division by zero
嵌套try语句结束!
[Errno 2] No such file or directory: '不存在的文件.txt'
执行完毕!

本文详细介绍了Python中的异常处理结构,包括try、except的基础及复杂用法,else和finally子句的使用,以及try语句的嵌套。通过这些,可以有效地捕获和处理程序运行时可能出现的错误,保证程序的稳定性和可维护性。

被折叠的 条评论
为什么被折叠?



