2

目前我有以下代码片段来处理 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 代码(否则搜索机器人可能会索引错误页面等)。

您将如何决定在这里记录什么以及忽略什么?基本上我想包括应用程序/业务错误,这表明错误,并忽略“正常”HTTP 错误。我也不只是想排除 404 错误,还有 403,谁知道还有什么。

4

3 回答 3

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;
}
于 2013-10-15T09:57:15.463 回答
0
protected void Application_Error(Object sender, EventArgs e)
        {
            WebException ex = new WebException();
            HttpWebResponse errorResponse = ex.Response as HttpWebResponse;
            if (errorResponse.StatusCode == HttpStatusCode.NotFound)
            { 

            }

在此处输入图像描述

于 2013-10-15T09:04:29.677 回答
0

我想出了一个简单的想法。解决方案的关键在于,所有业务和其他类型的意外异常都有一个 HTTP 代码 500,而普通 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
于 2013-10-18T08:40:14.513 回答