爲什麼在Python中捕獲所有異常是一個糟糕的主意?在Python中捕獲所有異常的錯誤主意
我知道使用except:
子句捕獲所有異常甚至會捕獲'特殊'python例外:SystemExit
,KeyboardInterrupt
和GeneratorExit
。那麼爲什麼不使用except Exception:
條款來捕捉所有異常?
爲什麼在Python中捕獲所有異常是一個糟糕的主意?在Python中捕獲所有異常的錯誤主意
我知道使用except:
子句捕獲所有異常甚至會捕獲'特殊'python例外:SystemExit
,KeyboardInterrupt
和GeneratorExit
。那麼爲什麼不使用except Exception:
條款來捕捉所有異常?
因爲它非常非特異性,並且它不會讓您對異常做任何有趣的事情。而且,如果你捕捉到每一個異常,那麼可能會有大量的異常發生,你甚至不知道正在發生(這可能會導致你的應用程序失敗,如果你不知道爲什麼)。您應該能夠預測(通過閱讀文檔或實驗)明確哪些例外需要處理以及如何處理它們,但是如果您從一開始就盲目壓制所有這些例外,那麼您永遠都不會知道。
因此,受歡迎的請求,這裏是一個例子。程序員正在編寫Python代碼,她得到了IOError
。而是進一步研究的,她決定捕獲所有異常:
def foo():
try:
f = open("file.txt")
lines = f.readlines()
return lines[0]
except:
return None
她並沒有意識到這個問題在他的方法:如果有什麼文件存在並且是可訪問的,但它是空的?然後這段代碼將產生一個IndexError
(因爲列表lines
是空的)。所以她會花費數小時的時間想知道爲什麼當文件存在時,她會從這個函數返回None
,並且如果沒有意識到某些事情很明顯,如果她更具體地捕捉錯誤,那就是她正在訪問的數據可能不是存在。
因爲您可能想要以不同方式處理每個異常。有一個KeyInterrupt不是一個編碼問題或一個操作系統是不一樣的......你可以一個接一個地捕獲特定的異常。
try:
XXX
except TYPE:
YYY
except TYPE:
ZZZ
得趕上「全身所有 – jamylak
我想這是更好地捕獲所有的生產代碼,但作爲軟件正在開發,它可能使你的代碼難以調試.... –
@jamylak:HTTP: //stephenvick.wordpress.com/2010/08/02/pokemon-exception-handling/ –