捕獲錯誤
try:
#可能出錯的代碼
except 錯誤類型 as e:
#出錯進行的代碼
else:
#不出錯才執(zhí)行的代碼
finally:
#無論是否出錯都要進行的代碼
錯誤有很多類型,可以有多個except捕獲錯誤:
try:
#可能出錯的代碼
except 錯誤類型1 as e:
#出錯進行的代碼1
except 錯誤類型3 as e:
#出錯進行的代碼2
except 錯誤類型3 as e:
#出錯進行的代碼3
Python的錯誤其實也是class运提,所有的錯誤類型都繼承自BaseException
蝗柔,所以在使用except
時需要注意的是,它不但捕獲該類型的錯誤民泵,還把其子類也“一網(wǎng)打盡”癣丧。
Python常見的錯誤類型和繼承關(guān)系
記錄錯誤
使用logging
模塊,打印錯誤信息
import logging
try:
10 / 0
except ZeroDivisionError as e:
logging.exception(e)
print("END")
運行結(jié)果:
ERROR:root:division by zero
Traceback (most recent call last):
File "finally.py", line 3, in <module>
10 / 0
ZeroDivisionError: division by zero
END
自定義錯誤
錯誤是一個class栈妆,可以選好繼承關(guān)系自定義錯誤
#自定義一個FooError繼承自ValueError
class FooError(ValueError):
pass
拋出錯誤
#raise拋出錯誤
raise 錯誤類型
另一種錯誤處理方式
def foo(s):
n = int(s)
if n==0:
raise ValueError('invalid value: %s' % s)
return 10 / n
def bar():
try:
foo('0')
#錯誤捕獲之后胁编,僅僅記錄了下來,然后用raise拋出
except ValueError as e:
print('ValueError!')
raise
bar()
raise
不帶參數(shù)签钩,會把錯誤原樣拋出
在excep
t中raise
一個Error掏呼,還可以把一種類型的錯誤轉(zhuǎn)化成另一種類型:
try:
10 / 0
except ZeroDivisionError:
raise ValueError('input error!')