2014-02-18 53 views
1

我正在嘗試使用在try...catch塊中處理的Elmah異常進行日誌記錄。在與Elmah try..catch處理的日誌異常

我加入了一個全球性的處理錯誤過濾器上Global.axax

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new ElmahHandledErrorLoggerFilter()); 
    filters.Add(new HandleErrorAttribute()); 
} 

這是我ElmahHandledErrorLoggerFilter

public class ElmahHandledErrorLoggerFilter : IExceptionFilter 
{ 
    public void OnException(ExceptionContext context) 
    { 
     if (context.ExceptionHandled) 
      ErrorSignal.FromCurrentContext().Raise(context.Exception); 
    } 
} 

它只會記錄異常,如try{ ... }catch{ throw new Exception(); }。但這不是問題,問題是我有一個try-catch方法,這個方法已經在另一個try-catch內部的代碼中調用。在這種情況下,儘管我將throw new Exception()放入內部方法的catch中,但它不會記錄異常,但它會返回到第一個方法中的catch而不記錄Exception。例如:

public void MainMethod() 
{ 
    try 
    { 
     SecondMethod(); 
    } 
    catch 
    { 
     ....second method jump here..... 
    } 
} 

public void SecondMethod() 
{ 
    try 
    { 
     int a =0; 
     int b =; 
     int result = b/a; 
    } 
    catch 
    { 
     throw new Exception(); 
    } 
} 

Elmah沒有記錄SecondMethod引發的異常。它回到主要的方法捕獲。如果主方法catch還有throw new Exception()代碼,則它會記錄該異常。但是,它將使用指向MainMethod而不是SecondMethod的堆棧跟蹤進行記錄。

我想要什麼,每次它在沒有重新拋出新異常的情況下達到捕獲時,Elmah都會記錄異常。這是因爲我的應用程序中有很多try-catch塊,我想記錄這些異常而無需手動記錄每個try-catch。但是,如果你告訴我如何從SecondMethod登錄例外情況,那很好。

回答

1

您使用的是ASP MVC嗎?

這些過濾器僅對從控制器方法拋出的未處理異常執行。 (context.ExceptionHandled屬性告訴你它是否被另一個過濾器處理過,而不是在try-catch塊中)。所以,如果你在你的方法中的try-catch塊中吞下異常,那麼它們將不會被錯誤過濾器處理。

您需要決定何時使用try-catch塊手動處理代碼中的異常(並且在這種情況下通過基本控制器類或幫助器類手動記錄異常)或讓異常泡泡並由您的過濾器處理。 (根據每個特定用例,您可能需要兩者的混合)

當您決定重新拋出異常時,請看this SO question。基本上,你可以重新拋出異常,並保留堆棧跟蹤:

try 
{ 
    //code 
} 
catch (Exception ex) 
{ 
    //...some error handling code here... 
    //Otherwise why the try-catch at all? 
    throw; 
} 

你可以做你的樣品MainMethod並記錄將保持堆棧跟蹤異常英寸