exponenta event banner

Правило AUTOSAR C++ 14 A15-4-1

Динамическое исключение - спецификация не должна использоваться

Описание

Определение правила

Динамическое исключение - спецификация не должна использоваться.

Объяснение

Динамическая спецификация исключения - это метод определения поведения функции в случае исключения с помощью throw(<list of exceptions>) в объявлении функции. При использовании динамической спецификации исключений возникают следующие проблемы:

  • Стоимость производительности: Поскольку динамические спецификации исключений проверяются во время выполнения, это увеличивает накладные расходы и может снизить производительность кода.

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

По этим причинам избегайте throw(<list of exceptions>) для указания исключений. Используйте noexcept вместо этого ключевое слово. Потому что noexcept операторы проверяются во время компиляции, они подходят для общего программирования и обычно обеспечивают лучшую производительность, чем throw заявления. Стандарт C++ 11 указывает, что спецификация динамических исключений будет удалена из C++ в будущем.

Внедрение Polyspace

Когда throw(<list of exceptions>) используется в объявлении функции, Polyspace ® помечает throw заявление. Polyspace не помечен throw операторов, которые используются для создания исключения.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

развернуть все

#include <string>
// throw for raising exception is compliant
void F9 () throw(std::runtime_error) {   //Non-compliant
	throw (std::runtime_error("foo"));   //Compliant
}
// Both declaration and definition is flagged
void F11 () throw(std::runtime_error);   //Noncompliant
void F11 () throw(std::runtime_error) {} //Noncompliant
// Instantiated and Noninstantiated templates are flagged
template <class T>
void F10 () throw(std::runtime_error) {  //Noncompliant
	throw (std::runtime_error("foo"));   //Compliant
}

template <class T>
void F12 () throw(std::runtime_error);   //Noncompliant
template <class T>
void foo() noexcept(noexcept(T())) {}//Compliant

void bar () {
	foo<int>();  // noexcept(noexcept(int())) => noexcept(true)
	F10<std::string> ();                 //Compliant
	
}

Операторы флагов Polyspace, такие как throw(std::runtime_error) которые используются в объявлениях и определениях функций как динамическая спецификация исключений. Избегайте динамической спецификации исключений. Использовать ключевое слово noexcept вместо этого. Шаблон foo использует noexcept ключевое слово в качестве спецификации исключения, которая соответствует этому правилу.

Проверить информацию

Группа: Обработка особых ситуаций
Категория: Обязательно, Автоматизировано
Представлен в R2021a