AUTOSAR C++14 Rule 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