捕获所有超时异常并使用更多上下文将它们记录到Elmah

时间:2015-10-13 08:13:23

标签: c# asp.net-mvc elmah

我使用ASP.NET MVC 4/5构建了多个Web应用程序。所有这些都使用Elmah进行错误处理,我们的应用程序也会出现很多超时错误。

以下是记录的方式:

  

等待操作超时

     

System.ComponentModel.Win32Exception

     

等待操作超时

enter image description here

我想在主题中记录更有意义的内容。像“DB Timeout - SP name”这样的东西可能更有用,否则我将不得不打开这些日志,读取堆栈跟踪然后调试。

现在要实现这一点,我知道我可以编写自定义异常,捕获所有db超时异常并使用存储过程名称重新抛出自定义异常。

但是这需要我在每个服务层代码中编写一个相同的try catch。

还有其他更好的方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

可以通过ELMAH的错误过滤功能实现。我已将此用于remove sensitive form data from elmah.io

简而言之,您需要挂钩ErrorLog_Filtering事件(请参阅ELMAH's documentation):

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs args)
{
    var httpContext = args.Context as HttpContext;
    if (httpContext != null && args.Exception is TimeoutException)
    {
        var error = new Error(args.Exception, httpContext);
        error.Message = "DB Timeout - SP name";
        ErrorLog.GetDefault(httpContext).Log(error);
        args.Dismiss();
    }
}

每次ELMAH想要在错误日志中记录错误时都会调用此方法。如果存在HTTP上下文并且抛出的异常是TimeoutException(仅使用此作为示例,您将需要将其替换为数据库异常),我们将从抛出的异常中创建新错误。新错误会自动从抛出的错误中获取所有信息。通过Log方法记录新错误,并通过调用事件参数上的Dismiss()消除错误消息的原始错误。