异常处理
python中我们会使用try...except...else...finally...
的错误处理机制,下面对此做一个简单的介绍。
try
一般我们编写的正常程序在try下执行,如果代码在执行过程中出现异常则中断当前跳转到对应的异常处理块中开始执行,整个except块是可选项,如果没有提供,则执行python默认的异常处理程序,即:中断执行,打印错误信息
except
捕获指定类型的异常进行处理
else
中间没有出现任何异常,则执行else中的语句
finally
finally
的字面意思是最终要执行的模块,也就是无论是否发生异常,只要提供了finally代码段,就在执行所有步骤之后执行finally中的程序。else必须在finally之前,finally必须在整个程序的最后。
测试
以下为实际程序的执行情况,相关代码如下:
if __name__ == '__main__':
try:
print('try')
1 / 0
except Exception as e:
print('except')
finally:
print('finally')
print('\n-------分界线-------\n')
try:
print('try')
1/0
except Exception as e:
print('except')
else:
print('else')
finally:
print('finally')
print('\n-------分界线-------\n')
try:
print('try')
except Exception as e:
print('except')
else:
print('else')
finally:
print('finally')
执行结果如下:
try
except
finally
-------分界线-------
try
except
finally
-------分界线-------
try
else
finally
这里的执行结果是很符合我们预期的,也很容易理解,但是如果在finally
之前执行了return
会怎样,我们知道执行return
函数会立即返回,实际测试如下:
def test_try_except1():
try:
print('try')
return 'try'
except Exception as e:
print('except')
else:
print('else')
finally:
print('finally')
def test_try_except2():
try:
print('try')
return 'try'
except Exception as e:
print('except')
return 'except'
else:
print('else')
return 'else'
finally:
print('finally')
return 'finally'
if __name__ == '__main__':
result1 = test_try_except1()
print(result1)
print('\n-------分界线-------\n')
result2 = test_try_except2()
print(result2)
执行结果:
try
finally
try
-------分界线-------
try
finally
finally
即使在finally
之前执行return
,finally
语句仍然正常执行,而且如果finally
包含return
则以finally
中return
的结果为最后返回值。查阅python的官方文档有下面一段话:
No matter what happened previously, the final-block is executed once the code block is complete and any raised exceptions handled. Even if there’s an error in an exception handler or the else-block and a new exception is raised, the code in the final-block is still run.
这里应该注意的是,不论有多少个return
语句,只要finally
包含return
,那么finally
下的return
惟一的返回值。