目前我有以下代码片段来处理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,谁知道还有什么。
答案 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)
{
}
答案 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