一. 异常处理代码
1.1 try...except...
try:
print('可能出现异常的代码')
except (Error1, Error2, Error3, ...) as e:
print('处理异常的代码')
except Exception:
print('处理异常的代码')
#Error: 异常类型,一个except代码块可以同时处理多种异常类型
#Exception : 表示所有异常类型,一般用在最后一个except块中
1.2 try...except...else...
try:
print(ss)
except (ZeroDivisionError, NameError) as e:
print('出现了除0错误和访问未声明变量错误中的一种')
except:
print('其他错误类型')
else:
print('没有异常时执行')
1.3 try...except...finally...
try:
print(ss)
except Exception as e:
print('出现了除0错误和访问未声明变量错误中的一种')
finally:
print('无论是否异常都会走的到此处')
finally可以结合try...except
,try...except...else
使用,也可以仅有try
和finally
。
1. 一定要避免在finally中编写return,raise等会终止函数的语句。
二. 使用traceback打印详细信息
import traceback
try:
1/0
except:
print(traceback.print_exc()) #打印报错详细堆栈信息
三. return出现在try中时执行顺序
3.1 情况1
def abc():
re = []
re_f = 'finally'
try:
re.append(1)
return re
1 / 0
except Exception:
print('in except ')
re.append(2)
return re
finally:
print('in finally')
re.append(3)
#return re_f
print(abc())
》》in finally
》》[1, 3]
》》 结论:try下面有return时,需要执行finally再执行try下的reutrn
3.2 情况2
def abc():
re = []
re_f = 'finally'
try:
re.append(1)
1 / 0
except Exception:
print('in except ')
re.append(2)
return re
finally:
print('in finally')
re.append(3)
#return re_f
print(abc())
》》》
in except
in finally
[1, 2, 3]
》》》
结论:except下有return时,会先执行finally中的语句再执行except中的return
3.3 情况3
def abc():
re = []
re_f = 'finally'
try:
re.append(1)
return re
1 / 0
except Exception:
print('in except ')
re.append(2)
return re
finally:
print('in finally')
re.append(3)
return re_f
print(abc())
》》》
in finally
finally
》》》结论: try和finally下都有return时,执行finally下的return