您的方法很好:您记录未处理的错误。这样做的目的是清除错误。人类无法避免错误,但我们可以快速修复它们。
从记录所有错误开始。然后将您学到的无用的个别错误或错误类别列入黑名单。在几次迭代中,您将拥有一个相当干净的日志。
删除所有不可操作的内容。例如,您的网站将有机器人执行疯狂的请求等。无需执行任何操作,因此您可以将它们从日志中删除。
我建议您也将看似无用的错误记录到补充日志文件中,以便您可以不时滚动浏览它以确保一切正常。
您特别想知道通常无害的错误发生的频率。每天三个死锁对你来说可能很酷,但 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;
}