try:
response = urllib2.urlopen(req)
except Exception, e:
logger.exception(e)
在這個代碼片段中是否有任何令人信服的論據反對捕獲Exception
而不是urllib2.URLError
?爲什麼不抓取異常而不是更具體的URLError?
try:
response = urllib2.urlopen(req)
except Exception, e:
logger.exception(e)
在這個代碼片段中是否有任何令人信服的論據反對捕獲Exception
而不是urllib2.URLError
?爲什麼不抓取異常而不是更具體的URLError?
有可能是出乎意料的原因,在這裏可能會引發一個你不知道或不知道的異常。你寫你的程序,好像這裏唯一的例外可能是urllib2.URLError
,然後有一天的內部產生一個不屬於這個的異常。這可能是一個錯誤,它可能只發生在滿月之上,它可能是你從未設計過的未來品牌例外。
你真的想要繼續暢通無阻嗎?
更一般地說,您捕獲的異常類型是程序邏輯的組成部分。如果你不夠具體,你會有一個邏輯錯誤,故事結束 - 就像你忽略了if
聲明中的一個子句一樣。
ctrl-c導致一個'KeyboardInterrupt'。另一個值得注意的例外是由'sys.exit()'引發的'SystemExit'' –
你提到的所有異常都不是'Exception'的子類,不會被捕獲! –
@mg - 謝謝,我正在引導我的Java日子。 @喬臣 - 哎呀,我沒有想到這一點。我從來沒有試圖抓住他們,你看:P我認爲我的一般觀點仍然存在。 – detly
好的,還是不是,取決於上下文。如果只有一種類型的異常可能發生,或者你不關心單獨處理不同類型的問題,那麼捕獲簡單異常就完全沒問題。它也沒有性能影響。然而,如果你的代碼假設被其他人使用和修改,你可以提高可讀性,提供特定的異常。
>>> import urllib2
>>> try: response = urllib2.urlopen(req)
... except Exception, e: print e
...
name 'req' is not defined
>>>
沒有太大的意義,既不是你的代碼片段。
除了*永遠不會*捕獲「例外」的常見參數? –