當我調用與系統庫(如shutil,http等)交互的代碼時,如果系統處於意外狀態(例如,文件鎖定,網絡不可用等)僅捕獲Python運行時錯誤
try:
# call something
except:
print("OK, so it went wrong.")
這困擾我,因爲它還捕捉基於編程錯誤SyntaxError
和其他異常,我見過的建議,以避免這種開放式的異常處理程序。
是否有一個約定,所有的運行時錯誤都來自一些常見的異常基類,我可以在這裏使用?或者任何不涉及語法錯誤,模塊導入失敗等的東西?即使KeyError
我會考慮一個bug,因爲我傾向於使用dict.get(),如果我不是100%確定密鑰將在那裏。
我不願意列出每一個可以想象的異常類型,特別是因爲我打電話給我很多支持代碼,我無法控制。
UPDATE: OK,問題的答案使我意識到我問錯了問題 - 我真正想知道的,如果有一個Python約定或明確的建議,爲圖書館的作家使用特定的基類的例外,以便將它們從更普通的朋友中分離出來。
因爲如果有一個圖書館編寫者的約定,我作爲一個圖書館消費者,可以對可能拋出什麼做出一般假設,即使具體情況可能會有所不同。不知道這是否更有意義?
再次更新:埃裏克森的回答最終讓我明白,而不是放棄和追趕在頂層的一切,我可以處理,並在較低的水平細化異常,因此頂層只需要擔心來自下面的級別的特定異常類型。
謝謝!
謝謝,我已經搜查,但沒有設法清除一個明確的答案。解析/語法/程序員錯誤和運行時錯誤之間的區別在哪裏? – 2012-02-17 15:29:59
請注意,您通常不會捕獲一個'SyntaxError' - 在編譯*源代碼時,很久以後它就會被拋出。如果你的'try'塊包含'import','exec','execfile()'或者'eval()',那麼'SyntaxError'唯一可以被捕獲。 – 2012-02-17 15:47:04
@SvenMarnach:呵呵,我確定我看過這些無類型的處理程序能夠捕捉到甚至語法錯誤,但它可能是其他的東西,更微妙。我沒有一個簡單的例子。感謝您的更正。 – 2012-02-17 15:51:38