我正在处理当前正在进行的项目。开发人员为try块添加了多个catch块。每个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个相同的消息。
无论如何,我只能记录一次错误而无需在任何地方更改代码吗?令人遗憾的是项目接近尾声,因此他们不希望花费额外的时间来做正确的事。 ><
答案 0 :(得分:0)
如果你只想在它发生时记录它,当它被抛出然后你可能只需要修改Common.Logger.LogError来添加类似ex.Data.Add(“ExceptionLogged”,true)然后你只需要循环查看innerexception以确定其中一个是否获得此值,如果有,则跳过保存
答案 1 :(得分:0)
最佳做法是不在每个级别捕获异常。如果您只是记录,那么您只想捕获并在“顶部”记录异常。
“顶部”是什么意思?这取决于您使用的技术。想到它的一种方法是在“最后可能的时刻”捕获异常。在代码中的那一点捕获它,如果你没有在那里捕获它,它将根本不会被捕获。
这可能位于事件处理程序中,也可能位于异步回调中,或位于Web服务的顶层。
答案 2 :(得分:0)
您可以使用Global.asax的Application_Error事件记录任何异常(但请注意these caveats):
protected void Application_Error(object sender, EventArgs e)
{
LogExceptionDetails(Server.GetLastError());
HttpContext.Current.Server.Transfer("~/Error.aspx");;
}
如果您implement this as an HttpModule,那么您的异常日志记录可以插入其他应用程序或通过简单地更改web.config文件来删除。请参阅该链接以获取代码详细信息。
或者ELMAH是一个非常有用的异常日志记录库。记录后,您可以重定向到custom error page(请参阅链接了解代码详情):
<customErrors mode="RemoteOnly" defaultRedirect="~/ErrorPages/CustomError.aspx">
<error statusCode="404" redirect="~/ErrorPages/404.aspx" />
</customErrors>
答案 3 :(得分:0)
我唯一能想到的是,如果你控制Common.Logger
类,在那里添加某种逻辑只记录第一次出现的异常。您可以尝试使用某些线程存储来跟踪异常,或者,由于标记提到了asp.net,您可以使用HttpContext.Items。 E.g:
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());
}
}
}
也许这有帮助吗?