如何处理多次重新抛出和记录的异常

时间:2013-01-03 15:51:49

标签: asp.net exception error-handling enterprise-library

我正在处理当前正在进行的项目。开发人员为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个相同的消息。

无论如何,我只能记录一次错误而无需在任何地方更改代码吗?令人遗憾的是项目接近尾声,因此他们不希望花费额外的时间来做正确的事。 ><

4 个答案:

答案 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());
        }
    }
}

也许这有帮助吗?