Предупреждение CA2200: повторное увеличение для сохранения сведений о стеке
Начиная с .NET 5 правило CA2200 анализатора кода .NET включено по умолчанию. Оно создает предупреждение сборки для всех блоков catch
, которые повторно выдают исключение, а исключение явным образом указывается в операторе throw
.
Описание изменения
Начиная с .NET 5 пакет SDK для .NET включает анализаторы исходного кода .NET. Некоторые из этих правил включены по умолчанию, в том числе CA2200. Если проект содержит код, нарушающий это правило и настроенный на обработку предупреждений как ошибок, это изменение может нарушить сборку.
Правило CA2200 помечает код, в котором исключения вызываются повторно, а переменная исключения указывается в операторе throw
. Часть информации в появившемся исключении представляет собой трассировку стека. Трассировка стека — это список иерархии вызовов методов, который начинается с метода, вызывающего исключение, и завершается методом, перехватывающим исключение. Если исключение повторно создается заданием исключения в операторе throw
, трассировка стека перезапускается в текущем методе, а список вызовов метода между исходным методом, создавшим исключение, и текущим методом теряется. Для сохранения исходных данных трассировки стека с исключением следует использовать оператор throw
без указания исключения.
Следующий фрагмент кода не создает предупреждение для правила CA2200. Однако строка с комментарием будет вызывать нарушение.
catch (ArithmeticException e)
{
// throw e;
throw;
}
Представленные версии
5,0
Рекомендуемое действие
Повторно создайте исключения без явного указания исключения. Дополнительные сведения см. в правиле CA2200.
Чтобы полностью отключить анализ кода, задайте для параметра
EnableNETAnalyzers
значениеfalse
в файле проекта. Дополнительные сведения см. в разделе EnableNETAnalyzers.
Затронутые API
Невозможно обнаружить с помощью анализа API.