简介:Python异常处理及注意事项
异常处理是对可预见的错误进行处理,比如我们在开发web接收前端参数时,可能接收参数类型以及值可能错误,此时我们可以抛出异常,在异常捕获中输出可视化的提示信息给用户。
python的异常捕获以及执行的顺序和其他语言有点不同,有些特点需要我们特别注意,今天我们就来介绍一下python的异常捕获方式及代码执行顺序问题
1. 捕获方式
python的异常捕获方式和其他语言有点不同,大多数编程语言都是 try/catch/finally 的形式,但是python是try/except/finally 的形式。如下所示:
try:
print('逻辑处理代码块')
except KeyError as e:
print('异常逻辑处理,错误信息:{}'.format(e))
finally:
print('不管有没有异常都会执行的代码块')
一般情况下,如果没有异常抛出以及错误,代码会执行的顺序是:try中代码块 =》finally中的代码块
2. 抛出异常时执行的顺序
如果try中抛出了异常或者错误,此时执行的顺序是:try中的代码块 =》except捕获的异常代码块 =》finally中的代码块
其中except是捕获异常的类型,如果try代码块中抛出的异常与except中捕获的异常类型不同时,代码会直接报错。例如下面的案例中,我们抛出了一个ValueError错误,except中却只捕获的KeyError错误,此时代码执行就会报错:
try:
print('逻辑处理代码块')
raise ValueError('测试不同类型的异常捕获')
# raise KeyError('测试')
except KeyError as e:
print('异常逻辑处理,错误信息{}'.format(e))
finally:
print('不管有没有异常都会执行的代码块')
代码执行结果如下所示:
从结果中看出,代码实际执行的顺序是:try代码块=》finally代码块 =》继续抛出未捕获的异常
如果想要捕获多个异常,可以使用如下方式:
try:
print('逻辑处理代码块')
raise ValueError('测试不同类型的异常捕获')
except KeyError as e:
print('key异常逻辑处理,错误信息:{}'.format(e))
except ValueError as e:
print('value异常逻辑处理,错误信息:{}'.format(e))
finally:
print('不管有没有异常都会执行的代码块')
如果多个异常的处理逻辑相同时,可以使用元组的方式定义捕获的异常,具体实现方式如下:
try:
print('逻辑处理代码块')
raise ValueError('测试不同类型的异常捕获')
except (KeyError,ValueError) as e:
print('多个异常逻辑处理相同时的写法,错误信息:{}'.format(e))
finally:
print('不管有没有异常都会执行的代码块')
如果想要捕获所有异常,可以直接捕获 Exception 类型的异常。Exception是所有异常类和错误的基类,所以捕获 Exception 异常就等于捕获了所有异常。具体代码如下:
try:
print('逻辑处理代码块')
raise ValueError('测试不同类型的异常捕获')
except Exception as e:
print('异常逻辑处理,错误信息:{}'.format(e))
finally:
print('不管有没有异常都会执行的代码块')
注意:except 后面的是捕获的异常类型
使用 Exception 捕获异常后,执行结果如下:
逻辑处理代码块
异常逻辑处理,错误信息:测试不同类型的异常捕获
不管有没有异常都会执行的代码块
4. else的作用
异常捕获除了上面的格式之外,还提供了一个 else 。else代码块是没有异常时才执行的代码块,也就是说 try 中的代码块没有异常才会执行 else 中的代码块。这个是python中特有的,其他大多数编程语言中都不存在这个else代码块
try:
print('逻辑处理代码块')
except Exception as e:
print('异常逻辑处理,错误信息:{}'.format(e))
else:
print('没有异常')
finally:
print('不管有没有异常都会执行的代码块')
执行顺序:逻辑处理代码块 =》没有异常=》不管有没有异常都会执行的代码块
5. exit()函数使用后执行的顺序
exit() 函数是终止程序的意思,但是如果我们在try中使用 exit() 终止程序后,它依然会执行 finally 中的代码块。这一点和大多数编程语言都不一样,例如。PHP中使用 exit() 后面的程序就终止执行了,即使使用try/catch/finally捕获最后也不会执行到 finally 中。
例如下方python代码中,使用了exit() 终止程序后,它依然执行了 finally 中的代码:
try:
print('逻辑处理代码块')
exit()
except Exception as e:
print('异常逻辑处理,错误信息:{}'.format(e))
else:
print('没有异常')
finally:
print('不管有没有异常都会执行的代码块')
执行结果:
逻辑处理代码块
不管有没有异常都会执行的代码块
有遗漏或者不对的可以在我的公众号留言哦