不要抓住一切

雖然通常很容易捕捉每一個節目:

try:
    very_difficult_function()
except Exception:
    # log / try to reconnect / exit gratiously
finally:
    print "The END"
    # it runs no matter what execute.

甚至一切(包括 BaseException 及其所有孩子,包括 Exception):

try:
    even_more_difficult_function()
except:
    pass  # do whatever needed

在大多數情況下,這是不好的做法。它可能會捕獲超過預期的內容,例如 SystemExitKeyboardInterruptMemoryError–每個應該通常以不同於通常的系統或邏輯錯誤的方式處理。這也意味著對內部程式碼可能出錯的內容以及如何從該條件中正確恢復沒有明確的理解。如果你捕獲每個錯誤,你將不會知道發生了什麼錯誤或如何解決它。

這通常被稱為“bug 掩蔽”,應該避免。讓你的程式崩潰,而不是默默地失敗,甚至更糟,在更深層次的執行失敗。 (想象一下,這是一個交易系統)

通常這些構造在程式的最外層使用,並將記錄錯誤的詳細資訊,以便可以修復錯誤,或者可以更具體地處理錯誤。