Поделиться через


Предупреждение 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.