2013-03-05 146 views
3

我有一個項目可能會拋出任何函數和對象的異常,有沒有辦法在整個框架/程序中捕獲任何和所有異常,以便我可以記錄它們,以便以後可以看到它們?我想要調用堆棧和異常消息。我不一定知道異常將拋出的位置,但我想記錄程序生命週期中任何地方發生的異常。無論如何要做到這一點?我不想嘗試捕捉任何可能的異常拋出函數。程序會因爲未處理的異常而中斷,但我想先記錄它。捕獲所有異常

+0

這是一個網絡,贏的形式或其他類型的項目? – Jason 2013-03-05 23:16:32

+0

Windows桌面應用程序,特別是WCF。 – iefpw 2013-03-05 23:17:08

+0

您的意思是這是一個WCF服務,自行託管在Windows Forms應用程序中? – 2013-03-05 23:40:49

回答

0

你能趕上在應用程序域級別的例外 - 如果你讀的鏈接App Domain Exception

AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 

它提到一些其他事件可能導致應用程序域不能觸發 - 例如ThreadException - 因此可能需要多個處理程序。

Application.ThreadException += new ThreadExceptionEventHandler (ThreadExceptionHandler); 

,並注意以下幾點:(有關的WinForms - SetUnhandledExceptionMode

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 
+0

「應用程序」僅適用於winforms。你可能想提一提。 – jgauffin 2013-03-07 12:33:53

+0

好點 - 完成。 – NDJ 2013-03-07 12:43:13

3

是的,有辦法做到這一點。 寫入以下行主:

// Add the event handler for handling UI thread exceptions to the event. 
Application.ThreadException += new ThreadExceptionEventHandler(MainForm_UIThreadException); 

// Set the unhandled exception mode to force all Windows Forms errors to go through 
// our handler. 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

// Add the event handler for handling non-UI thread exceptions to the event. 
AppDomain.CurrentDomain.UnhandledException += 
    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

,比處理異常

private static void MainForm_UIThreadException(object sender, ThreadExceptionEventArgs t) 
{ 
    //do something 
} 

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    //do something 
} 
0

你總是可以使用AppDomain.UnhandledException

static void Main() 
{ 
    AppDomain currentDomain = AppDomain.CurrentDomain; 
    currentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_UnhandledException); 
} 

private static void AppDomain_UnhandledException(object sender, UnhandledExceptionEventArgs args) { 
    Logger.Log((Exception)args.ExceptionObject); 
} 
1

一大看點,捕獲異常的處理它們正確地根據拋出的異常的類型。通過擁有一個大的異常處理程序,您無法處理各個異常,而是可能只是在吞嚥它們。但這並不是說它不能完成或不應在所有情況下完成。

如果您的項目需要一個大處理程序,那麼您可以簡單地處理AppDomain.UnhandledException事件。即使你在別處捕捉異常,處理這種方法也是一個好主意,以確保你的程序不會在錯過異常時拋出不友好的錯誤。這假定你正在創建一個WinForm

由於您也使用WCF,您可以查看IErrorHandler接口來幫助處理故障消息。

0

是否有一種方法可以捕獲整個 框架/程序中的任何異常,以便日後可以看到它們?

,有桌面應用或Web應用程序來處理未處理的異常處理程序。在桌面應用程序中,該事件稱爲UnhandledException。在Web應用程序中,它是應用程序入口點上的Application_Error(通常是Global.asax.cs)。

我不想嘗試和捕捉任何可能的異常拋出 函數。該程序會因爲未處理的異常而中斷,但我想要先登錄它。

如果你不想捕捉異常,你總是可以簡單地重新拋出。它將繼續冒泡以破壞程序。

catch(Exception ex) 
{ 
    //logging here 
    throw;//rethrow 
} 

我想調用堆棧和異常信息。

Exception類包含這些。在事件處理程序的情況下,有多種訪問方式取決於它是什麼類型的應用程序。

1

有沒有辦法在整個框架/程序中捕獲任何和所有異常,以便我可以記錄它們以便日後可以看到它們?

捕捉所有未處理的異常爲所有應用程序類型的唯一方法是使用已經提到AppDomain.CurrentDomain.UnhandledException。然而,你不能阻止你的應用程序終止使用該事件(嗯,你可以,但我不會告訴你這是怎麼回事,因爲它有點駭人聽聞)。

但是,在大多數框架中都可以捕獲未處理的異常,這些異常允許您只是查看異常並繼續前進。既然你提到過WCF你可能想看看IErrorHandler

我不想嘗試着去捕捉任何可能的異常拋出函數。

這就是我如何做到的。 Do NOT catch that exception。 ;)

+0

不錯的鏈接 - 我會在稍後閱讀。 – NDJ 2013-03-07 12:44:04