使用Elmah记录try..catch中处理的异常

时间:2014-02-18 18:49:58

标签: c# exception exception-handling try-catch elmah

我正在尝试使用try...catch块中处理的Elmah异常进行记录。

我在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。如果main方法catch也有throw new Exception()代码,那么它会记录异常。但是,它将被记录,堆栈跟踪指向MainMethod而不是SecondMethod

我想要的是每当它到达一个捕获而不重新抛出新的异常时,Elmah会记录异常。这是因为我的应用程序中有许多try-catch块,我想记录这些异常,而无需手动登录每个try-catch。但是,如果你告诉我如何从SecondMethod中记录那个没问题的例外。

1 个答案:

答案 0 :(得分: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中执行此操作,并且记录的异常将保留堆栈跟踪。