exponenta event banner

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