2010-05-06 99 views
1

我想捕獲所有引發(處理或未處理)異常以記錄它們。對於未處理的我使用ThreadExceptionEventHandler和UnhandledExceptionEventHandler但我想捕獲和嘗試catch塊中有或沒有(例外e)的異常。可以繼承異常類來創建一般事件嗎?捕獲所有(已處理或未處理)異常

回答

1

從Exception繼承以提供您自己的Exception類對於您在代碼中生成的異常可以很好地工作,並且可以使用內部異常構造函數在鏈中攜帶內置異常。

如果您想要嘗試這樣做,您需要替換所有的異常處理代碼,並且可能還需要添加更多塊。我認爲它不會比Peter McGrattan的方法好很多,但它可能允許您在保留&檢查原始異常和重新投擲時使用不同的選項,例如記錄下它是否已經被記錄下來鏈。

只要是明確的,可以使用:

catch (Exception e) 
{ 
    log(e); 
    throw; 
} 

將重新拋出原始異常。

1

聽起來像是你有未處理的異常所涵蓋的可能,處理的異常你就不能最終...

catch (Exception e) {}

並與實例調用相同的日誌記錄功能。

如果沒有,你真的必須有一些情況下,您有一個追趕,但沒有抓住,你可以用一個實例...

catch { throw; }

重新拋出該異常最終被捉住並記錄作爲一個未處理的例外。

+0

這是一個非常大的應用程序,我需要把log.write()放在所有try catch塊中,這就是我想要避免的。謝謝 – andySF 2010-05-06 10:49:43

2

從Windows XP開始,即使在知道處理或未處理之前,您也可以得到關於每個引發異常的通知。 這可以通過所謂的「向量化」異常處理來實現,這實際上是對標準結構化異常處理的一點補充。

致電AddVectoredExceptionHandler添加您自己的處理程序。你會馬上叫異常引發之後,無論是通過明確throw/__CxxThrowException/RaiseException或隱式處理器(訪問衝突或等)

您可以登錄異常處理函數中(如農產品堆轉儲),並返回EXCEPTION_CONTINUE_SEARCH

+0

http://msdn.microsoft.com/en-us/library/ms681420(VS.85).aspx是基本的msdn文章。沒有給出c#的例子,並且看着它,我懷疑它是不平凡的。 – penguat 2010-05-06 11:29:26

+0

如果你舉個例子,它會很好:) – andySF 2010-05-06 11:38:44

0

沒有辦法捕獲已捕獲的異常,但可能與AddVectoredExceptionHandler一起工作。

說了這麼多,你可以使用一個接球重新拋出的方法:

catch(Exception e) { 
    Logger.Log(e); 
    throw; 
} 

catch(Exception e) { 
    bool rethrow = LoggerStrategy.Log(e); 
    if(rethrow) { throw; } 
} 

更妙的是,使用記錄應用程序塊。