3

我正在处理的当前项目有问题。开发人员为 try 块添加了多个 catch 块。每个捕获都记录错误,然后重新抛出它。像这样的东西:

catch (OdbcException ex)
{
    ex.Data.Add("CodeSource", MethodBase.GetCurrentMethod().Name);
    ex.Data.Add("My Value", myValue);
    Common.Logger.LogError(ex, "DataAccess");
    throw;
}
catch (Exception ex)
{
    ex.Data.Add("CodeSource", MethodBase.GetCurrentMethod().Name);
    ex.Data.Add("My Value", myValue);
    Common.Logger.LogError(ex, "DataAccess");
    throw;
}

最重要的是,调用类也可能有 catch 块做同样的事情。所以日志文件是一团糟。我已经看到记录了多达 5 条以上的相同消息。

无论如何我可以只记录一次错误而不必到处更改代码吗?可悲的是,该项目已接近尾声,因此他们不希望将额外的时间花在正确的工作上。><

4

4 回答 4

0

我唯一能想到的是,如果您控制Common.Logger该类,则在其中添加某种逻辑以仅记录第一次发生的异常。您可以尝试使用一些线程存储来跟踪异常,或者由于标签提到 asp.net,您可以使用HttpContext.Items。例如:

public static class Logger
{
    public static void LogError(Exception e, string category)
    {            
        int hashcode = e.GetHashCode();
        if (!HttpContext.Current.Items.Contains(hashcode))
        {
            HttpContext.Current.Items.Add(hashcode, null); 
            System.Diagnostics.Trace.TraceError(e.ToString());
        }
    }
}

也许这有帮助?

于 2013-01-04T07:29:27.123 回答
0

如果您只想在它发生时记录它,那么当它被抛出时,也许您只需要修改 Common.Logger.LogError 以添加类似 ex.Data.Add("ExceptionLogged", true) 的内容,那么您只需要循环找出其中一个是否有这个值的内部异常,如果有,跳过保存

于 2013-01-03T16:37:41.943 回答
0

最佳实践是不要在每个级别都捕获异常。如果您只是在记录,那么您只想在“顶部”捕获并记录异常。

“顶”是什么意思?这取决于您使用的技术。一种思考方式是“在最后可能的时刻”捕获异常。在你的代码中捕捉它,如果你没有捕捉到它,它根本不会被捕捉到。

这可能在事件处理程序中,或者在异步回调中,或者在 Web 服务的顶层。

于 2013-01-03T16:41:39.873 回答
0

您可以使用 Global.asax 的 Application_Error 事件记录任何异常(但请注意这些 警告):

protected void Application_Error(object sender, EventArgs e)
{
    LogExceptionDetails(Server.GetLastError());
    HttpContext.Current.Server.Transfer("~/Error.aspx");;
}

如果您将其实现为 HttpModule,那么您的异常日志记录可以插入到其他应用程序中,或者只需更改 web.config 文件即可将其删除。有关代码详细信息,请参见该链接。

或者,ELMAH是一个非常有用的异常记录库。登录后,您可以重定向到自定义错误页面(有关代码详细信息,请参见链接):

<customErrors mode="RemoteOnly" defaultRedirect="~/ErrorPages/CustomError.aspx">
    <error statusCode="404" redirect="~/ErrorPages/404.aspx" />
</customErrors>
于 2013-01-03T17:04:02.203 回答