如何检测的重新抛出使用了StyleCop或VS2010 C#的异常一个糟糕的方式?
题
我的同事们调味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 。
其他提示
时捕获异常不必要的代码?如果你只在登录异常感兴趣,那么你只需要在你的代码的顶层(在最后可能的地步,你可以做记录)的渔获物。这可能你有渔获数量严重减少后顾之忧。
我会建议寻找在罚球结束追赶块...;而不是用掷结束;
虽然你得到一些假阳性,你可以手工筛选出来。
不隶属于 StackOverflow