一、如何捕获异常
1.使用try…except捕获所有异常
如下示例代码:
def test_div(num1, num2):
"""当除数为0"""
return num1 / num2
if __name__ == '__main__':
temp = test_div(5, 0)
print(temp)
如果temp = test_div(5, 0)
传入5
和0
时,会报除数不能为0的异常ZeroDivisionError: division by zero
如果temp = test_div(5, 'a')
传入5
和a
(任意字符)时,会报类型错误异常TypeError: unsupported operand type(s) for /: 'int' and 'str'
异常处理时可以使用try...except
进行统一处理
try:
temp = test_div(5, 0)
print(temp)
except:
print("除数不能为0")
当try
语句内发生异常时会执行except
里的内容,但是如上的处理会存在一定问题,如果test_div(5, 'a')
传入任意字符时发生异常或者发生其它异常时依旧会执行print("除数不能为0")
,所以针对传入不同参数进行不同的异常处理才符合逻辑。
2.使用try…except捕获指定异常
需要在except的后面把发生的异常指定出来,报什么错就指定什么错误。
try:
temp = test_div(5, 'a')
print(temp)
except ZeroDivisionError:
print("除数不能为0")
except TypeError:
print("类型输入错误")
除数为0就执行ZeroDivisionError
后的内容,除数为字符就执行TypeError
后的内容
3.使用try…except捕获多个指定异常
如果嫌上面的异常处理对每一个进行处理过于麻烦,也可以进行统一的处理,把发生的异常用()
括起来
try:
temp = test_div(5, 'a')
print(temp)
except (ZeroDivisionError, TypeError):
print("反正报错了!")
在捕获多个异常的时候如果不知道发生了什么异常,为了方便排查程序中出现的问题,可以使用as
把异常对象打印出来,将上面的代码修改成如下所示
try:
temp = test_div(5, 'a')
print(temp)
except (ZeroDivisionError, TypeError) as error:
print("反正报错了!")
print(error)
执行结果:
在try
里报错了,也在except
里面进行处理了,程序已经执行完毕,如果这时程序中还有一部分必不可少的逻辑需要执行,可以在报错之后使用finally
在程序的后面在进行一次操作
4.使用try…except…finally处理必不可少的逻辑
try:
temp = test_div(5, 1)
print(temp)
except (ZeroDivisionError, TypeError) as error:
print("反正报错了!")
print(error)
finally:
print("无论如何最后我也得执行")
传入5
和1
时的执行结果:
传入5
和0
时的执行结果
二、自定义异常
当系统预置的异常不够我们使用的时候,需要自定义异常