2013-01-03 58 views
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块做samething。所以日志文件是一团糟。我已经看到多达5个相同的消息记录。

无论如何,我可以只记录一次错误,而无需到处更改代码?可悲的是,这个项目已接近尾声,因此他们不需要花费额外的时间来做正确的事情。 > <

回答

0

如果你只想在它发生的时候记录它,当它被抛出,那么也许你只需要修改Common.Logger.LogError来添加类似ex.Data.Add(“ExceptionLogged”,true)的东西,然后您只需循环查看内部错误以确定其中一个是否具有此值,如果是,则跳过保存

+0

我喜欢这个,但是如果我抛出丢失异常的数据不是数据;? –

0

最佳做法是不要在每个级别都捕捉异常。如果您只是记录日志,那么您只想捕获并记录“顶部”的异常。

“顶部”是什么意思?这取决于您使用的技术。想一想的方法是在“最后时刻”赶上例外情况。在代码中的那个点捕捉它,如果你没有捕捉到它,它就不会被捕获。

这可能位于事件处理程序中,也可能位于异步回调中,也可能位于Web服务的顶层。

+0

我完全同意你的看法。但令人悲伤的是,我正与那些甚至不了解软件设计基础知识的人一起工作,更不用说这一点了。此外,该项目不想花时间。 –

+0

我一直在那里做。在故障排除期间浪费了大量时间,因为您必须忽略大部分日志条目,但首先必须找出哪些要忽略。 –

0

您可以登录使用Global.asax中的Application_Error事件任何异常(但要注意thesecaveats):

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

如果你implement this as an HttpModule那么你的异常日志记录可以插入到其他应用程序或通过简单地改变网络中删除。配置文件。查看该链接了解代码详情。

或者ELMAH是一个非常有用的异常记录库。登录您可以重新定向到一个custom error page后(见链接代码详细信息):

<customErrors mode="RemoteOnly" defaultRedirect="~/ErrorPages/CustomError.aspx"> 
    <error statusCode="404" redirect="~/ErrorPages/404.aspx" /> 
</customErrors> 
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()); 
     } 
    } 
} 

也许这可以帮助吗?

+0

应该HttpContext.Current.Items.Add(hashcode,null);是HttpContext.Current.Items.Add(hashcode,true);? if语句每次都不会是真的吗?如果异常被重新抛出,哈希码也是相同的吗?我们并没有抛出异常变量,而只是抛出异常; –

+0

@JasonHardesty,好点。 :)我认为Contains可能更适合。 –