Мои коллеги - опытные хакеры 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.
Есть мысли о том, как добиться того, что я ищу?