【问题标题】:Log exceptions handled in try..catch with Elmah使用 Elmah 在 try..catch 中处理的日志异常
【发布时间】:2014-03-18 17:40:48
【问题描述】:

我正在尝试使用在 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 而不记录异常。例如:

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();
    }
}

SecondMethod 抛出的异常没有被 Elmah 记录。它回到主方法catch。如果 main 方法 catch 也有 throw new Exception() 代码,那么它会记录异常。然而,它将被记录,堆栈跟踪指向MainMethod,而不是SecondMethod

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

【问题讨论】:

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


    【解决方案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 中执行此操作,并且记录的异常将保留堆栈跟踪。

    【讨论】:

      猜你喜欢
      • 2018-10-14
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2017-03-04
      相关资源
      最近更新 更多