2012-05-15 48 views
7

爲什麼在Python中捕獲所有異常是一個糟糕的主意?在Python中捕獲所有異常的錯誤主意

我知道使用except:子句捕獲所有異常甚至會捕獲'特殊'python例外:SystemExit,KeyboardInterruptGeneratorExit。那麼爲什麼不使用except Exception:條款來捕捉所有異常?

+6

得趕上「全身所有 – jamylak

+0

我想這是更好地捕獲所有的生​​產代碼,但作爲軟件正在開發,它可能使你的代碼難以調試.... –

+4

@jamylak:HTTP: //stephenvick.wordpress.com/2010/08/02/pokemon-exception-handling/ –

回答

20

因爲它非常非特異性,並且它不會讓您對異常做任何有趣的事情。而且,如果你捕捉到每一個異常,那麼可能會有大量的異常發生,你甚至不知道正在發生(這可能會導致你的應用程序失敗,如果你不知道爲什麼)。您應該能夠預測(通過閱讀文檔或實驗)明確哪些例外需要處理以及如何處理它們,但是如果您從一開始就盲目壓制所有這些例外,那麼您永遠都不會知道。

因此,受歡迎的請求,這裏是一個例子。程序員正在編寫Python代碼,她得到了IOError。而是進一步研究的,她決定捕獲所有異常:

def foo(): 
    try: 
     f = open("file.txt") 
     lines = f.readlines() 
     return lines[0] 
    except: 
     return None 

她並沒有意識到這個問題在他的方法:如果有什麼文件存在並且是可訪問的,但它是空的?然後這段代碼將產生一個IndexError(因爲列表lines是空的)。所以她會花費數小時的時間想知道爲什麼當文件存在時,她會從這個函數返回None,並且如果沒有意識到某些事情很明顯,如果她更具體地捕捉錯誤,那就是她正在訪問的數據可能不是存在。

+0

@Raffe:請給我具體的例子嗎? – Bandicoot

+0

@Bandicoot爲什麼捕捉所有異常的具體例子是一個壞主意? –

+0

@Raffe:是的。將幫助我更好地理解你的答案。謝謝 ! – Bandicoot

3

因爲您可能想要以不同方式處理每個異常。有一個KeyInterrupt不是一個編碼問題或一個操作系統是不一樣的......你可以一個接一個地捕獲特定的異常。

try: 
    XXX 
except TYPE: 
    YYY 
except TYPE: 
    ZZZ 
相關問題