Как обнаружить неправильный способ перезапуска C # Exception, используя StyleCop или VS2010? - PullRequest
4 голосов
/ 14 мая 2010

Мои коллеги - опытные хакеры 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.

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

Ответы [ 3 ]

5 голосов
/ 14 мая 2010

FxCop имеет правило для этого: RethrowToPreserveStackDetails

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

Я считаю, что FxCop Analysis встроен в VS2010, но я не уверен на 100% ...

Вот ссылка Microsoft для загрузки FxCop .

1 голос
/ 14 мая 2010

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

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

1 голос
/ 14 мая 2010

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

...