除了可以捕获到指定的异常和没有发生异常这两种情况外,还有第三种情况,就是在try和except之间的代码块中,发生了异常,但不是指定的异常:
- try:
- # 将输入x和y的代码放进try中,其余不变
- x = int(input('请输入被除数:'))
- y = int(input('请输入除数:'))
- result = x / y
- print('结果为{}'.format(result))
- except ZeroDivisionError:
- print('除数不能为零')
- print('=' * 30)
尝试输入被除数为一个不能转换为整数的字符串,如字母'c':
- 请输入被除数:c
- Traceback (most recent call last):
- File "example.py", line 2, in <module>
- x = int(input('请输入被除数:'))
- ValueError: invalid literal for int() with base 10: 'c'
Python解释器提示出错了,ValueError,而上述代码只能捕获ZeroDivisionError,这就是第三种情况,如果发生了异常,但不是指定的ZeroDivisionError,Python解释器仍然报错(除非在外层的try-except语句中处理了这个异常)。
如果想同时处理这两种异常,那么可以将这两种异常名称全部写在except语句后面,用逗号分隔开,并用括号括起来:
- try:
- x = int(input('请输入被除数:'))
- y = int(input('请输入除数:'))
- result = x / y
- print('结果为{}'.format(result))
- except (ZeroDivisionError, ValueError):
- print('除数不能为零, 且被除数与除数必须为数字')
- print('=' * 30)
运行修改后的程序,输入被除数为'c':
- 请输入被除数:c
- 除数不能为零, 且被除数与除数必须为数字
- ==============================
由此可见,成功处理了ValueError。再次运行程序,试试它还能不能处理ZeroDivisionError:
- 请输入被除数:10
- 请输入除数:0
- 除数不能为零, 且被除数与除数必须为数字
- =============================
可以同时处理这两种异常,要处理更多的异常也是如此,只要在括号中添加待处理的异常即可。除此之外,还可以使用多个except关键字,分别处理这两种异常的情况,这样做的好处是可以根据不同的异常进行不同的处理:
- try:
- x = int(input('请输入被除数:'))
- y = int(input('请输入除数:'))
- result = x / y
- print('结果为{}'.format(result))
- except ZeroDivisionError: # 处理ZeroDivisionError
- print('除数不能为零!')
- except ValueError: # 处理ValueError
- print('除数与被除数必须为数字!')
- print('=' * 30)
测试是否能处理这两种异常,首先测试是否处理ValueError:
- 请输入被除数:s
- 除数与被除数必须为数字!
- ==============================
然后测试是否处理ZeroDivisionError:
- 请输入被除数:10
- 请输入除数:0
- 除数不能为零!
- ==============================
由此可见,使用两个except关键字能够分别处理这两种异常情况。