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

Пустой бросок (бросок;) буду только использоваться в составном операторе обработчика выгоды

Описание

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

Пустой бросок (бросок;) буду только использоваться в составном операторе обработчика выгоды.

Объяснение

Когда вы используете пустой оператор (throw;) броска, компилятор проверяет, присутствует ли объект исключения в текущем осциллографе. Если текущий осциллограф содержит объект исключения, компилятор повышает временный объект, содержащий текущее исключение. Если текущий осциллограф не содержит объекты исключения, компилятор вызывает std::terminate() неявно. Функциональный std::terminate() отключает выполнение программы заданным реализацией способом. Таким образом, точный процесс завершения программы зависит от программного и аппаратного обеспечения, которое вы используете. Например, std:terminate() может вызвать std::abort() неправильно прерывать выполнение, не раскручивая стек, ведя к утечке ресурсов и уязвимостям системы обеспечения безопасности.

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

Реализация Polyspace

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

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

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

Примеры

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

#include <iostream>       
#include <typeinfo>       
#include <exception>      

void handleException()//function to handle all exception
{
	try {
		throw; // Noncompliant
	}
	catch (std::bad_cast& e) {
		//...Handle bad_cast...
	}
	catch (std::bad_alloc& e) {
		//...Handle bad_alloc...
	}
	catch(...){
		//...Handle other exceptions
	}
}

void f()
{
	try {
		//...something that might throw...
	}
	catch (...) {
		handleException();
	}
}

В этом примере, функциональном handleException() повышает текущее исключение при помощи пустого оператора броска, и затем направляет его к соответствующему catch блок. Этот метод делегирования обработки исключений работает, как предназначено только когда функциональный handleException() называется из catch блок. Пустой оператор броска может вызвать резкое завершение программы, если функция вызвана в каком-либо другом осциллографе, который не содержит исключение. Polyspace отмечает пустой оператор броска.

#include <iostream>       
#include <typeinfo>       
#include <exception> 
void foo()//function to handle all exception
{
	try {
		//...
	}
	catch (std::bad_cast& e) {
		//...Handle bad_cast...
	}
	catch (std::bad_alloc& e) {
		//...Handle bad_alloc...
	}
	catch(std::exception& e){
		//...Handle std::exceptions
		// if exception cannot be handled
		// throw it again
		throw;//Compliant
	}
}

int main(){
	try{
		foo();
	}
	catch(...){
		
	}
}

Этот пример показывает совместимое использование пустого оператора броска. Функциональный foo содержит try-catch создайте, который обрабатывает определенные исключения. Если повышенное исключение не может быть обработано, foo повышает исключение снова как необработанное исключение при помощи пустого оператора броска. В main, функциональный foo вызывается и любое необработанное исключение, являющееся результатом foo обработан в типовом catch(...) блок. При помощи пустого оператора броска обработка исключения распространена через блоки выгоды foo и main. В этом случае пустой оператор броска выполняется только, когда существует исключение в том же осциллографе, потому что это в catch блок. Polyspace не отмечает его.

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

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