MISRA C++:2008 Rule 15-3-6

Где несколько обработчиков обеспечиваются в одном операторе try-catch или функциональном блоке попытки для производного класса, и некоторые или все его основы, обработчики должны быть упорядочены наиболее выведенные базовому классу

Описание

Управляйте определением

Где несколько обработчиков обеспечиваются в одном операторе try-catch или функциональном блоке попытки для производного класса, и некоторые или все его основы, обработчики должны быть упорядочены наиболее выведенные базовому классу.

Объяснение

В try-catch или function-try блок, объекты исключения производного класса совпадают к обработчику с catch блоки, которые принимают базовый класс. Если вы помещаете обработчики основного класса исключений, прежде чем обработчики выведенного класса исключений, обработчик базового класса обработает и основу и исключения производного класса. Обработчик производного класса становится недостижимым кодом, который является неожиданным поведением. При использовании иерархии классов, чтобы повысить исключения, убедитесь, что обработчик производного класса предшествует обработчику базового класса.

Реализация Polyspace

Polyspace® отмечает блок обработчика, если он следует за обработчиком базового класса.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

#include<exception>
// classes used for exception handling
class MathError { };
class NotANumber: public MathError { };
class DivideByZero: public NotANumber{};

void bar(void){
	try
	{
		// ...
	}
	catch ( MathError &e ) 
	{
		// ...
	}
	catch ( NotANumber &nan ) // Noncompliant
	{
		// Unreachable Code
		
	}
	catch (DivideByZero &dbz)//Noncompliant
	{
		//Unreachable Code
	}
}

В этом примере три класса в иерархии могут возникнуть в try блок. Обработчик catch блоки обрабатывают исключения.

  • Блок catch ( NotANumber &nan ) следует за обработчиком его базового класса catch ( MathError &e ). Поскольку исключение класса NotANumber также соответствия к обработчику catch ( MathError &e ), блок catch ( NotANumber &nan ) обработчика становится недостижимым кодом. Порядок этого блока несовместим с этим правилом. Polyspace отмечает блок обработчика.

  • Блок catch ( DivideByZero &dbz ) становится недостижимым кодом потому что исключения класса DivideByZero соответствуйте к предыдущим обработчикам его базовых классов. Polyspace отмечает блок catch ( DivideByZero &dbz ) обработчика.

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

Группа: Обработка исключений
Категория: необходимый
Введенный в R2013b