2015-10-07 36 views
0

當我的應用程序因未處理的異常而崩潰時,我正在使用AppDomain.UnhandledException事件處理程序執行某些日誌記錄。在AppDomain.UnhandledException處理程序中獲取除外對象

void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {...} 

我想能夠登錄了typeof(object)和各種object場/屬性時,未處理的異常的來源是我的自定義對象類之一,但似乎無論是在信息不包括UnhandledExceptionEventArgssender對象。我試着鑄造sender,但可以理解的是sender只是AppDomain,它引發了這個例外。

有沒有辦法從檢索此信息此事件處理程序?我唯一能想到的其他事情是在每次對象拋出時使用靜態字段來存儲對象的引用,但我認爲這需要我爲每種類型都設置一個靜態字段,以便我爲此執行此操作。

注:我知道,stack trace可能會導致我異常的來源,但是這並沒有讓我記錄有關崩潰期間對象重要狀態信息。

例如,如果從e.ExceptionObject我的堆棧跟蹤

Stack Trace: 
    at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult) 
    at CustomLibrary.CustomObject.readCallback(IAsyncResult ar) 
    at System.Net.LazyAsyncResult.Complete(IntPtr userToken) 
    ... 

我希望能夠得到的NetworkStream對象,這將讓我找到相關CustomObject集合中的一個參考。

回答

0

嘗試使用下面的代碼,並看到異常是否被捕獲或不是。也只是檢查你的代碼中的任何地方是否重新拋出異常像throw ex。如果是,它會吃掉你正在尋找的堆棧跟蹤,嘗試只用throw rethrowing。

[STAThread] 
    static void Main() 
    { 
    AppDomain currentDomain = default(AppDomain); 
    currentDomain = AppDomain.CurrentDomain; 
    // Handler for unhandled exceptions. 
    currentDomain.UnhandledException += GlobalUnhandledExceptionHandler; 
    // Handler for exceptions in threads behind forms. 
    System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler; 
    ... 
    } 

private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) 
{ 
    Exception ex = default(Exception); 
    ex = (Exception)e.ExceptionObject; 
    ILog log = LogManager.GetLogger(typeof(Program)); 
    log.Error(ex.Message + "\n" + ex.StackTrace); 
} 


private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e) 
{ 
    Exception ex = default(Exception); 
    ex = e.Exception; 
    ILog log = LogManager.GetLogger(typeof(Program)); //Log4NET 
    log.Error(ex.Message + "\n" + ex.StackTrace); 
} 

希望這有助於!

+0

嗨Dev。我沒有遇到捕獲未處理的異常或生成堆棧跟蹤的問題,我所需要的就是能夠獲取對引發原始異常的對象**的引用。我只用'throw;'重新拋出異常。 – khargoosh