在Global.asax Application_Error()中记录什么和忽略什么?

时间:2013-10-15 08:44:24

标签: asp.net .net error-handling

目前我有以下代码片段来处理Global.asax Application_Error()中的错误:

    var ex = server.GetLastError();
    server.ClearError();
    if (ex is HttpUnhandledException && ex.InnerException != null)
        ex = ex.InnerException;
    Trace.TraceError(ex.ToString());
    // send some output to the user that they should contact support etc

它捕获所有错误,例如404错误(当用户键入不存在的.aspx URL时,或者当浏览器请求诸如favicon.ico和静态文件请求之类的东西设置为通过管道时)。这有两个问题:不应该记录(日志中没有无用的404错误),原始的HTTP代码应该被发回(否则搜索机器人可能会索引错误页面等。)

您如何决定记录什么以及在此忽略什么?基本上我想要包含表示错误的应用程序/业务错误,并忽略" normal" HTTP错误。我也不想只排除404错误,还有403,谁知道还有什么。

3 个答案:

答案 0 :(得分:2)

您的方法很好:您记录未处理的错误。关键在于清除错误。人类无法避免错误,但我们可以快速解决它们。

首先记录所有错误。然后黑名单个别错误或您学到的错误类别都是无用的。在几次迭代中,您将拥有一个相当干净的日志。

删除所有无法操作的内容。例如,您的网站会有机器人执行疯狂请求等等。无需任何操作,因此您可以从日志中删除它们。

我建议您还将看似无用的错误记录到补充日志文件中,以便您可以不时滚动它以确保一切正常。

您特别想知道频率通常无害的错误。每天三个死锁对你来说可能很酷,但300可能太多了。

我将提供您的全局错误处理程序可能包含的草图:

static bool IsExceptionIgnored(Exception exception)
{
    if (exception == null) throw new ArgumentNullException("exception");

    var nestedExceptions = exception.GetExceptionChain();
    return nestedExceptions.Any(ex =>
        ex is ViewStateException ||
        ex.Message.Contains("Timeout") ||
        ex.Message.StartsWith("Invalid viewstate") ||
        ex.Message.Contains("potentially dangerous") ||
        ex.Message.Contains("The remote host closed the connection") ||
        ex.Message.Contains("System.Web.UI.ViewStateException: Invalid viewstate") ||
        ex.Message.Contains("System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError") ||
        ex.Message.Contains("0x80070032") ||
        (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) ||
        ex is ThreadAbortException);
}
public static IEnumerable<Exception> GetExceptionChain(this Exception exception)
{
    if (exception == null) throw new ArgumentNullException("exception");

    for (var current = exception; current != null; current = current.InnerException)
        yield return current;
}

答案 1 :(得分:0)

protected void Application_Error(Object sender, EventArgs e)
        {
            WebException ex = new WebException();
            HttpWebResponse errorResponse = ex.Response as HttpWebResponse;
            if (errorResponse.StatusCode == HttpStatusCode.NotFound)
            { 

            }

enter image description here

答案 2 :(得分:0)

我提出了一个简单的想法。解决方案的关键是所有业务和其他类型的意外异常都具有500的HTTP代码,而普通的HTTP异常没有,它们具有403,404等代码。这是一个代码片段:

var ex = server.GetLastError();
if (ex is HttpException && ((HttpException)ex).GetHttpCode() != 500)
    return; // the usual yellow error screen appears with the normal HTTP error code

// we handle the error ourselves
server.ClearError();
if (ex is HttpUnhandledException && ex.InnerException != null)
    ex = ex.InnerException;
// log the error, tell the user to contact support