Как обнаружить плохое способом повторно бросать исключение C # с помощью STYLECOP или VS2010?

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;
}

Я должен был бы использовать такой инструмент, как стиликом (который у меня есть, версия 4.3.3.0). Я использую VS2008 на данный момент, но скоро переключится на VS2010.

Любые мысли о том, как достичь того, что я ищу?

Это было полезно?

Решение

FXCOP имеет правило для этого: RethrowtopreservestackDetails.

Как только исключение брошено, часть информации, которую она несет, - это трассировка стека. Трассировка стека представляет собой список иерархии вызова метода, которая начинается с метода, который бросает исключение и заканчивается методом, который ловит исключение. Если исключение повторно выброшено путем указания исключения в операторе броска, трассировка стека перезапускается по текущему способу и список вызовов метода между исходным методом, который бросил исключение, и текущий метод теряется. Чтобы сохранить исходную информацию о трассировке стека с исключением, используйте оператор броска без указания исключения.

Я считаю, что анализ FXCOP построен в VS2010, но я не на 100% конечно ...

Здесь Microsoft скачать ссылку на fxcop.

Другие советы

Код ловит исключения без необходимости? Если вы заинтересованы только в регистрации исключения, то вам нужен только улов на верхнем уровне вашего кода (на последней возможной точке, где вы можете сделать ведение журнала). Это может серьезно уменьшить количество уловов, о которых вы должны беспокоиться.

Я бы предложил посмотреть блоки уловки, заканчивающиеся в броске ...; вместо того, чтобы закончиться с броском;.

Хотя вы получаете ложный положительный результат, вы можете отфильтровать их вручную.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top