Python
大约 3 分钟
Python
目录
异常
语法错误和异常
Python 中(至少)有两种错误
语法错误
(syntax errors)- 也被称为解析错误,
语法分析器
指出错误行,并且在检测到错误的位置前面显示一个小“箭头”
- 也被称为解析错误,
异常
(exceptions)- 运行期检测到的错误称为异常,最终会产生一个错误信息,错误信息的最后一行指出发生了什么错误
异常类型
异常有不同的类型,异常类型做为错误信息的一部分显示出来
常见的有
- 零除错误( ZeroDivisionError )
- 命名错误( NameError)
- 类型错误( TypeError )
异常处理(try-except-else & raise)
try-except-else 使用
使用
try-except-else
&raise
处理流程
使用补充
- 一个 try 语句可能包含多个 except 子句,分别指定处理不同的异常。至多只会有一个分支被执行
- 最后一个 except 子句可以省略异常名称,以作为通配符使用
else子句 使用
作用
可以带有一个
else
子句,该子句只能出现在所有 except 子句之后当 try 语句没有抛出异常时,需要执行一些代码,可以使用这个子句
使用场景
finally子句 使用
作用
语句还有另一个可选的子句
finally
,目的在于定义在任何情况下都一定要执行的功能(不管有没有发生异常、不管异常有没有被捕捉到、不管以break/continue/return等任何方式退出)
处理流程:
- 若发生了未被except捕获的异常,则先执行finally子句,然后再重新抛出
使用场景
- 定义清理行为。比如用于释放外部资源,无论它们在使用过程中是否出错
使用实例
with open("...") as f:
的本质就是try-finally
,即该语句能确保发生异常时也能顺利关闭文件f
raise 使用
用户自定义异常
异常类通常应该直接或间接的从 Exception 类派生
例如:
>>> class MyError(Exception):
... def __init__(self, value):
... self.value = value
... def __str__(self):
... return repr(self.value)
...
>>> try:
... raise MyError(2*2)
... except MyError as e:
... print('My exception occurred, value:', e.value)
...
My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'