問題
解決方案
想要捕獲所有的異常,可以直接捕獲 Exception 即可:
1
2
3
4
5
|
try : ... except Exception as e: ... log( 'Reason:' , e) # Important! |
這個將會捕獲除了 SystemExit
、 KeyboardInterrupt
和 GeneratorExit
之外的所有異常。 如果你還想捕獲這三個異常,將 Exception
改成 BaseException
即可。
討論
捕獲所有異常通常是由于程序員在某些復雜操作中并不能記住所有可能的異常。 如果你不是很細心的人,這也是編寫不易調試代碼的一個簡單方法。
正因如此,如果你選擇捕獲所有異常,那么在某個地方(比如日志文件、打印異常到屏幕)打印確切原因就比較重要了。 如果你沒有這樣做,有時候你看到異常打印時可能摸不著頭腦,就像下面這樣:
1
2
3
4
5
|
def parse_int(s): try : n = int (v) except Exception: print ( "Couldn't parse" ) |
試著運行這個函數,結果如下:
1
2
3
4
5
|
>>> parse_int( 'n/a' ) Couldn't parse >>> parse_int( '42' ) Couldn't parse >>> |
這時候你就會撓頭想:“這咋回事啊?” 假如你像下面這樣重寫這個函數:
1
2
3
4
5
6
|
def parse_int(s): try : n = int (v) except Exception as e: print ( "Couldn't parse" ) print ( 'Reason:' , e) |
這時候你能獲取如下輸出,指明了有個編程錯誤:
1
2
3
4
|
>>> parse_int( '42' ) Couldn't parse Reason: global name 'v' is not defined >>> |
很明顯,你應該盡可能將異常處理器定義的精準一些。 不過,要是你必須捕獲所有異常,確保打印正確的診斷信息或將異常傳播出去,這樣不會丟失掉異常。
以上就是Python 捕獲代碼中所有異常的方法的詳細內容,更多關于Python 捕獲異常的資料請關注服務器之家其它相關文章!
原文鏈接:https://python3-cookbook.readthedocs.io/zh_CN/latest/c14/p07_catching_all_exceptions.html