什麼是需要什麼工具來完成這項工作。
例外是一個非常強大的工具。在使用它們之前,問問你是否需要這種力量以及隨之而來的複雜性。
例外可能會出現簡單,因爲你知道,當有異常的行被擊中一切都停了下來。儘管這裏發生了什麼?
會發生未捕獲的異常嗎?
全局錯誤處理是否會捕獲異常?
異常是否會被更多嵌套和詳細的錯誤處理處理?
您必須知道堆棧中的所有內容才能知道該異常會執行哪些操作。這違反了獨立的概念。現在這個方法依賴於錯誤處理來做你期望的事情。
如果我有一個方法,我不應該在乎那種方法以外的東西。我應該只關心輸入是什麼,如何處理它,以及如何返回響應。
當你使用你基本上是說,我不在乎在這裏發生了什麼異常,出了問題,我不希望它變得更糟,做任何需要做的事情,以減輕這個問題。
現在,如果你關心如何處理錯誤,你會做一些更多的思考和構建到方法的接口,例如如果您試圖找到某個對象,則可能會返回該對象的默認值(如果找不到該對象),而不是拋出諸如「找不到對象」之類的異常。
當你建立自己的錯誤處理到你的方法接口,不僅是方法的簽名更具描述性的它可以做什麼,但它把如何處理的方法的調用者錯誤的責任。調用者方法可能能夠解決它,如果沒有,它會再次上報鏈。最終你會到達應用程序的入口點。現在應該拋出一個異常,因爲如果你正在使用應用程序的公共接口,你應該更好地理解如何處理異常。
讓我給你一個我的Web服務錯誤處理的例子。
Level 1. Global.asax中的全局錯誤處理 - 這是防止未捕獲的異常的安全網。這絕不應該故意達成。
2級Web服務方法 - 在一個try/catch包裹,以保證它會一直遵守其JSON接口。
級別3.工作者方法 - 這些方法獲取數據,處理數據並將其原始返回到Web服務方法。
在worker方法中拋出異常是不對的。是的,我有嵌套的Web服務方法錯誤處理,但該方法可以在其他可能不存在的地方使用。
相反,如果一個工人的方法來獲取記錄和記錄不能被發現,它只是返回null。 Web服務方法檢查響應,當它發現null時,它知道它不能繼續。 Web服務方法知道它有錯誤處理來返回json,所以拋出異常只會返回json中發生的細節。從客戶的角度來看,將它打包成可以輕鬆解析的json是非常棒的。
你看到每一塊只是知道它需要做什麼,做它。當您在混音中拋出異常時,會劫持應用程序流。這不僅導致難以遵循代碼,而且濫用異常的反應是try/catch。現在你更可能會濫用另一個非常強大的工具。
我經常看到try/catch捕捉應用程序中的所有內容,因爲開發人員害怕他們使用的方法比看起來更復雜。
嘿,我不是故意粗魯,但你不會以任何理由支持你的陳述。 – 2008-10-08 00:49:47
這是正確的,對於框架或系統開發,異常處理與應用程序完全不同。 – OscarRyz 2008-10-08 00:56:15
@Esteban Araya:好點 - 我沒有提到從頭到尾的連續文本很重要。 – 2008-10-08 00:59:53