我使用ASP.NET MVC 4/5构建了多个Web应用程序。所有这些都使用Elmah进行错误处理,我们的应用程序也会出现很多超时错误。
以下是记录的方式:
等待操作超时
System.ComponentModel.Win32Exception
等待操作超时
我想在主题中记录更有意义的内容。像“DB Timeout - SP name”这样的东西可能更有用,否则我将不得不打开这些日志,读取堆栈跟踪然后调试。
现在要实现这一点,我知道我可以编写自定义异常,捕获所有db超时异常并使用存储过程名称重新抛出自定义异常。
但是这需要我在每个服务层代码中编写一个相同的try catch。
还有其他更好的方法可以解决这个问题吗?
答案 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()消除错误消息的原始错误。