Как обнаружить плохое способом повторно бросать исключение C # с помощью STYLECOP или VS2010?
Вопрос
Мои коллеги приправлены 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;
}
Я должен был бы использовать такой инструмент, как стиликом (который у меня есть, версия 4.3.3.0). Я использую VS2008 на данный момент, но скоро переключится на VS2010.
Любые мысли о том, как достичь того, что я ищу?
Решение
FXCOP имеет правило для этого: RethrowtopreservestackDetails.
Как только исключение брошено, часть информации, которую она несет, - это трассировка стека. Трассировка стека представляет собой список иерархии вызова метода, которая начинается с метода, который бросает исключение и заканчивается методом, который ловит исключение. Если исключение повторно выброшено путем указания исключения в операторе броска, трассировка стека перезапускается по текущему способу и список вызовов метода между исходным методом, который бросил исключение, и текущий метод теряется. Чтобы сохранить исходную информацию о трассировке стека с исключением, используйте оператор броска без указания исключения.
Я считаю, что анализ FXCOP построен в VS2010, но я не на 100% конечно ...
Другие советы
Код ловит исключения без необходимости? Если вы заинтересованы только в регистрации исключения, то вам нужен только улов на верхнем уровне вашего кода (на последней возможной точке, где вы можете сделать ведение журнала). Это может серьезно уменьшить количество уловов, о которых вы должны беспокоиться.
Я бы предложил посмотреть блоки уловки, заканчивающиеся в броске ...; вместо того, чтобы закончиться с броском;.
Хотя вы получаете ложный положительный результат, вы можете отфильтровать их вручную.