捕獲多個異常
當(dāng)一個代碼片段可能會拋出多個異常時荧缘,可以將異常類型放入一個元組中(必須是元組(),數(shù)組[]沒有效果),如下所示。使用as
關(guān)鍵字來獲得被拋出異常的引用
try:
dosomthing()
except (URLError, ValueError) as e:
print ("error")
except
語句是順序檢查的等浊,只有第一個匹配的異常會執(zhí)行,下面代碼中, print ("Exception error") 并不會被執(zhí)行
try:
raise URLError
except (URLError, ValueError) as e:
print ("error")
except Exception:
print ("Exception error")
在調(diào)試的時候楣富,如果對某個特定異常的類層級關(guān)系不確定凿掂,可以通過查看異常的__mro__
屬性來快速瀏覽伴榔。例如:
>>> FileNotFoundError.__mro__
(<class 'FileNotFoundError'>, <class 'OSError'>, <class 'Exception'>,
<class 'BaseException'>, <class 'object'>)
>>>
如果想要捕獲所有異常纹蝴,可以直接捕獲Exception
或者不明確指明異常類型庄萎,如下所示
try:
...
except Exception as e:
...
log('Reason:', e)
try:
...
except:
...
log('Reason:')
Exception
將會捕獲除了SystemExit
KeyboardInterrupt
GeneratorExit
之外的所有異常。如果還想捕獲這3個異常塘安,可以使用BaseException
捕獲異常后拋出新異常
可以在捕獲異常之后糠涛,再拋出一個自定義的異常
try:
...
except IOException as e:
...
log('Reason:', e)
raise Exception
這種方式只保留最后拋出異常的堆棧信息,如果希望保存原始異常信息兼犯,可以直接使用raise
,
try:
...
except IOException as e:
...
log('Reason:', e)
raise