在.NET中,方法簽名不會告訴我是否錯過了處理可能由代碼拋出的一些異常。 是否有一些工具可以警告我,如果說我正在使用HashTable刪除但尚未處理ArgumentNullException?我不想在運行時感到驚訝。我怎麼知道我是否還沒有處理一些我的.NET代碼可能拋出的未經檢查的異常?
這是否意味着您需要非常瞭解您的代碼,否則未檢查的異常可能會更難以使用?
在.NET中,方法簽名不會告訴我是否錯過了處理可能由代碼拋出的一些異常。 是否有一些工具可以警告我,如果說我正在使用HashTable刪除但尚未處理ArgumentNullException?我不想在運行時感到驚訝。我怎麼知道我是否還沒有處理一些我的.NET代碼可能拋出的未經檢查的異常?
這是否意味着您需要非常瞭解您的代碼,否則未檢查的異常可能會更難以使用?
實際上,通過終止程序來處理意外的異常是處理這種情況的最好方法,因爲一般情況下,當意外事件發生時程序狀態是未定義的。如果您記錄所有異常,並且擁有一套體面的驗收測試,則可以消除由於程序流而導致意外異常的問題。
通過檢查方法輸入,類的單元測試和理解你的框架來進行防禦性編程,預計會有大部分例外。
對於您試圖完成的任務,沒有語言支持。我們爲VS編寫了一個海關插件,以確保我們API的所有入口點都嘗試捕獲日誌。然而,我從來沒有看到強制你覆蓋所有可能聲明的異常情況的語言的價值,因爲你仍然需要編寫一些代碼來執行一些有意義的錯誤。大多數人只是看着編譯器抱怨寫一個處理程序,並隱藏一些可能是一些有用的錯誤,在一些無用的代碼。在某些情況下,它最好失敗並知道存在問題。
您應該爲您的應用程序添加最高級別的異常處理程序,併爲您的應用程序編寫單元,功能和集成測試,以測試所有可能的用例。這將幫助您消除幾乎所有未檢查的異常。
也儘量不要捕捉異常,但要消除原因。 (即抓不住ArgumentNullException
但不經過null
的Windows應用程序:
AppDomain currentDomain = default(AppDomain);
currentDomain = AppDomain.CurrentDomain;
// Handler for unhandled exceptions.
currentDomain.UnhandledException += UnhandledExceptionHandler;
// Handler for exceptions in threads behind forms.
Application.ThreadException += ThreadExceptionHandler;
public static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)
{
}
public static void ThreadExceptionHandler(object sender, Threading.ThreadExceptionEventArgs e)
{
}
@Aseem:不知道我明白這一點。所以,如果我沒有處理它們,所有未處理和線程相關的異常都會出現在這裏。它提供了一些安全性。是您的意圖嗎? – 2010-02-05 09:33:17
是的...然後您可以決定如何處理這些例外情況。 – 2010-02-05 11:47:24
我同意這是一件壞事,只是捕捉異常,而不是用它適當地做出如何的程序應該做出反應決定這是不好的,就像在VB6中說'On Error Resume Next'。 – awe 2010-02-05 06:30:49