1、try-except语句
在代码中出现的异常,除了可以看到解释器报错外,还可以捕获并处理它们。在Python中使用try-except语句处理异常,语法格式如下:
try:
代码块1
except 异常名称:
代码块2
try-except语句的工作流程如下:
①执行在try和except之间的代码块1,如果发生了异常,则会根据异常类型提交处理,这一过程为异常捕获。
②如果发生except 后指定的异常,那么跳过代码块1中剩余的代码,执行except语句下面的代码块2。成功处理指定异常的过程称为异常处理。
③如果没有发生指定的异常,那么执行完try和except之间的代码块1后,跳过except语句下面的代码块2,继续执行后面的代码。
下面是一个处理异常的示例,它让用户输入两个整数,并求出这两个整数相除的结果,由于用户输入的除数可能为零,除数为零就会发生异常(使用脚本模式运行):
- x = int(input('请输入被除数:'))
- y = int(input('请输入除数:'))
- try:
- result = x / y
- print('结果为{}'.format(result))
- except ZeroDivisionError:
- print('除数不能为零')
- print('=' * 30) # 这一行用来确定程序运行到哪了
输入几组数据,测试运行结果:
- 请输入被除数:10
- 请输入除数:5
- 结果为2.0
- ==============================
- 请输入被除数:10
- 请输入除数:0
- 除数不能为零
- ==============================
由此可知,如果程序发生了指定异常,并且成功将它捕获,那么Python解释器并不会报错,而是跳过try和except之间的代码块,执行except语句下面的的代码块。
2、else语句
在try-except语句块中,还可以包含else语句,其语法格式如下:
try:
代码块1
except:
代码块2
else:
代码块3
当未引发任何异常时,执行else代码块:
- try:
- x = int(input('请输入被除数:'))
- y = int(input('请输入除数:'))
- result = x / y
- except (ZeroDivisionError, ValueError): # 这里同时捕获两种异常
- print('除数不能为零, 且被除数与除数必须为数字')
- else:
- print('=' * 30)
- print('结果为{}'.format(result))
输入一组数据,运行结果:
- 请输入被除数:10
- 请输入除数:5
- ==============================
- 结果为2.0
3、finally语句
Python中的finally用来做后续的“清理工作”,其语法格式如下:
try:
代码块1
except :
代码块2
finally :
代码块3
如果存在finally语句,无论try-except代码块是否发生错误,finally代码块都将执行:
- try:
- x = int(input('请输入被除数:'))
- y = int(input('请输入除数:'))
- result = x / y
- except (ZeroDivisionError, ValueError):
- print('除数不能为零, 且被除数与除数必须为数字')
- else:
- print('结果为{}'.format(result))
- finally:
- print('再见!')
当发生异常时,else代码块并没有执行,但是finally代码块执行了:
- 请输入被除数:10
- 请输入除数:0
- 除数不能为零, 且被除数与除数必须为数字
- 再见!
当未发生异常时,else代码块执行了,finally代码块也执行了:
- 请输入被除数:10
- 请输入除数:5
- 结果为2.0
- 再见!
因此,当存在try-except-else-finally语句时,首先执行try-except代码块;如果没有异常,那么执行else代码块,否则不执行;而finally代码块无论怎样都会执行。
4、raise语句
raise语句用来抛出异常,可以自定义引发哪种错误以及向用户显示文本。抛出自定义异常时,可以在异常类型后加上括号,并在括号内写出要显示的文本。在下面的示例中,引发类型异常时,自定义的提示文本是“类型不对”:
- >>> raise TypeError('类型不对')
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- TypeError: 类型不对