2011-05-01 83 views
0

這是一個非常流行和衆所周知的短語,您應該「只捕捉/拋出異常的例外」。但是,如何確定「例外」例外?Juding是否例外情況

例如,一個錯誤的密碼在登錄服務時非常例行,所以這並不例外。 Web應用程序的統計信息可能會顯示類似於每5次嘗試一次的錯誤登錄嘗試(從沒有特定用戶)。同樣,在試圖在網上商店購物籃結賬時,這可能非常普遍(特別是對於新用戶)。但是,沒有找到的文件可能會發生任何變化。我通常按​​照以下方式工作:如果一個方法缺少某些工作來執行它的工作,則拋出一個異常,但是在這裏它會有點混亂。在某些情況下,沒有找到的文件可能很常見(例如,許多用戶使用的文件共享沒有嚴格的控制),而非鎖定的生產環境缺少文件,這是非常特殊的。

這是正確的方式來推斷異常是否例外嗎?我可以很容易地過濾諸如沒有網絡連接之類的東西,但是有些情況很難判斷。這是主觀的嗎?

感謝

+0

只是因爲這很普遍,並不意味着它不應該引起異常。 – nos 2011-05-01 00:49:07

+0

這真的是一個衆所周知的短語?這究竟意味着什麼?你在哪裏看到有人定義它?看起來你是在要求定義這個__ known_詞組的意思,但我不認爲它是衆所周知的。我在谷歌搜索中找不到任何提及。 – Hogan 2011-05-01 00:52:18

+0

但是,如果你的問題真的是 - 我的代碼何時不處理異常(即_throw_)。答案很簡單:當一些事情發生時,你的代碼無法從中恢復。 _當然,其他所有事情都有例外(雙關語意思)這個規則_ – Hogan 2011-05-01 00:54:49

回答

1

我認爲這是相當主觀的,說實話,所以我更喜歡以避免搞清楚的時候,我應該使用異常的那個方法。

相反,我寧願要考慮三件事情:

  1. 是不是有可能,我可能要讓調用堆棧放鬆多個等級?
  2. 還有別的辦法嗎? (返回null或錯誤代碼等)如果是這樣,我是否有絲毫的性能問題?
  3. 如果這兩者都不能做出明確的決定,那麼需要維護代碼的人更容易閱讀這些決定?

如果#1爲真,並且我沒有主要的性能問題,我可能會選擇使用異常,因爲它會加快我的開發時間而不必編寫返回碼(並手動編碼讓他們在需要時傳播調用堆棧的邏輯)。當您使用異常時,調用堆棧展開對於開發時間是免費的。

如果#2是真的,或者我不會超過一幀(也許兩個?)調用堆棧或者我有一個嚴重的性能問題(例如,在一個緊密的循環中),那麼我'我會努力尋找另一種不涉及例外的方式。

例外只是程序員使用支持它們的語言的工具。我不相信他們必須對什麼是「特殊」與否有任何內在價值。相反,我說使用它們時,他們是最好的工具

+1

其他的考慮發生在諸如C++的語言中,比如如果選擇使用異常,所有的代碼必須是異常安全的,即必須正確釋放資源。 – 2011-05-01 00:59:16

+0

好的思維方式。 「讓調用堆棧放鬆多個級別」是什麼意思? – dotnetdev 2011-05-01 00:59:18

+0

@dotnetdev:如果你想在幾個層次上捕捉異常(即,你不想在異常代碼的相同函數中捕捉異常)。異常會自動返回調用堆棧,以與調用方式相反的順序丟棄函數上下文。如果你想使用返回碼,你必須在EACH中間函數級別有處理邏輯,例如'if(errorCode!= SUCCESS)返回errorCode;',有時這可能是寫十次的痛苦。 – 2011-05-12 16:21:14