C # catch (FileNotFoundException) и CA1031 - PullRequest
       17

C # catch (FileNotFoundException) и CA1031

5 голосов
/ 31 октября 2019

Таким образом, этот код вызывает CA1031.

try
{
    // logic
}
catch (FileNotFoundException) // exception type
{
    // handle error
}

Пока этот код не:

try
{
    // logic
}
catch (FileNotFoundException ex) // exception var
{
    // handle error
}

Поскольку тип исключения имеет смысл, мне не нужен ex в первом примере. Но это не общий тип исключения. Это не IOException или Exception. Так почему же он по-прежнему вызывает CA1031?

Так есть ли разница между catch(FileNotFoundException) и catch(FileNotFoundException ex) за исключением того факта, что я не собираю информацию об исключениях?

Ответы [ 2 ]

4 голосов
/ 31 октября 2019

Таким образом, этот код запускает CA1031

try
{
    // logic
}
catch (FileNotFoundException) // exception type
{
    // handle error
}

Это происходит потому, что "общее исключение, такое как System.Exception или System.SystemException, перехвачено в уловеиспользуется выражение или общее предложение catch, такое как catch () ". Чтобы исправить это, назначьте его и обработайте ошибку и / или сбросьте общее исключение для дальнейшей обработки.

При дальнейшем исследовании кажется, что использовал как ошибку, выможете увидеть больше здесь ;это Roslyn проблема для FxCop.

Исправление: Просто обновите последний пакет анализаторов FxCop, и оно должно пройти путь.

NuGet:

 Install-Package Microsoft.CodeAnalysis.FxCopAnalyzers -Version 2.9.7

Список литературы: CA1031

0 голосов
/ 31 октября 2019

У меня есть две статьи, которые я использую в качестве основы для обработки исключений:

Я также связываю этичасто, когда я замечаю ошибки обработки исключений.

FileNotFound явно является экзогенным исключением, поэтому правильно его перехватить. Однако эти статьи также говорят, что, как правило, всегда регистрируют или выставляют эти исключения. В идеале результат Exception.ToString (). Если у вас нет способа сослаться на пойманное исключение, как вы можете сделать одно из этих двух? Вы можете дать только общее сообщение об ошибке, но с ни одна из деталей вам не понадобится для его отладки .

В то время как во многих случаях вам нужно только выставить тип Exception для пользователь , нет ни одного, где вы бы хотели log Тип исключения. В связанных статьях упоминается об этом явно, но из-за отрицательных голосов и комментариев мне кажется необходимым повторить это.

Так что это один из тех случаев, когда аргумент все еще идет, если это ошибка или функция .

Для меня это определенно больше похоже на особенность. Я бы наверняка назвал вас потенциальной проблемой, если бы увидел это в вашем коде. Это позволяет избежать недогрузки. Вы можете проверить, сохраняется ли ошибка, если вы напишите throw; в конце блока catch. Это перезапустит исключение, поэтому отсутствие возможности ссылаться на исключение в этом ExceptionHandler не будет критическим.

...