如何检测的重新抛出使用了StyleCop或VS2010 C#的异常一个糟糕的方式?

StackOverflow https://stackoverflow.com/questions/2835506

  •  26-09-2019
  •  | 
  •  

我的同事们调味C ++黑客切换到.NET。一个错误的,它们使无意中正在编写代码这样的:

catch(ArgumentExcepttion ae)
{
    // Code here logs the exception message
    // And this is supposed to re-throw the exeception
    throw ae; // as opposed to throw;
    // But, as we all know, doing this creates a new exception with a shorter stack trace.
}

我已经看到了很多很多地方这件事。我真的不能相信的情况下切断堆栈跟踪将是有益的。我认为应该是例外的情况,值得评论。纠正我,如果我错了。如果堆栈跟踪是要切,我认为这始终是更好地做:

throw new ArgumentException("text", ae /* inner exc */);

总之,我想要做的是检测所有此类案件和给予警告。正则表达式搜索就是因为这样的没有帮助,:

catch(Exception e)
{
    Exception newExc = new Exception("text", e);
    Log(newExc);
    throw newExc;
}

我将不得不使用工具如StyleCop的(我有,版本4.3.3.0)。我使用VS2008现在,但很快就会被切换到VS2010。

这是如何完成我所期待的有什么想法?

有帮助吗?

解决方案

的FxCop具有用于此的规则: RethrowToPreserveStackDetails

  

在将引发异常的一部分   它承载的信息是   堆栈跟踪。堆栈跟踪是一个列表   方法调用层次结构的   与抛出的方法开始   异常,并结束该方法   映入例外。如果   异常是由指定重新抛出   在throw语句外,   堆栈跟踪是在重新启动   目前的方法和手段的清单   原来的方法调用之间   抛出异常和当前   方法丢失。为了保持原有的   与堆栈跟踪信息   异常,使用throw语句   不指定除外。

我相信的FxCop分析内置于VS2010,但我不是100%肯定...

下面是微软下载链接为的FxCop

其他提示

时捕获异常不必要的代码?如果你只在登录异常感兴趣,那么你只需要在你的代码的顶层(在最后可能的地步,你可以做记录)的渔获物。这可能你有渔获数量严重减少后顾之忧。

我会建议寻找在罚球结束追赶块...;而不是用掷结束;

虽然你得到一些假阳性,你可以手工筛选出来。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top