Каждое исключение, явным образом добавленное, код должен иметь обработчик совместимого типа во всех путях к вызову, которые могли привести к той точке.
Каждое исключение, явным образом добавленное, код должен иметь обработчик совместимого типа во всех путях к вызову, которые могли привести к той точке.
На C++, когда операция повышает исключение, компилятор пытается совпадать с исключением совместимому обработчику исключений в текущих и смежных осциллографах. Если никакой совместимый обработчик исключений для повышенного исключения не существует, компилятор вызывает функциональный std::terminate() неявно. Функциональный std::terminate() отключает выполнение программы заданным реализацией способом. Таким образом, точный процесс завершения программы зависит от определенного набора программного и аппаратного обеспечения, которое вы используете. Например, std::terminate() может вызвать std::abort() неправильно прерывать выполнение, не раскручивая стек. Если стек не раскручен перед завершением программы, то деструкторы переменных в стеке не вызываются, ведя к утечке ресурсов и уязвимостям системы обеспечения безопасности.
Рассмотрите этот код, где несколько исключений повышены в блоке кода попытки.
class General{/*... */};
class Specific : public General{/*...*/};
class Different{}
void foo() noexcept
{
try{
//...
throw(General e);
//..
throw( Specific e);
// ...
throw(Different e);
}
catch (General& b){
}
}General. Этот блок выгоды совместим за исключениями базового класса General и производный класс Specific. Исключение класса Different не имеет совместимого обработчика. Это необработанное исключение нарушает это правило и может привести к утечкам ресурсов и уязвимостям системы обеспечения безопасности.Поскольку необработанные исключения могут привести к утечке ресурсов и уязвимостям системы обеспечения безопасности, совпадать с явным образом повышенными исключениями в вашем коде с совместимым обработчиком.
Polyspace® отмечает throw оператор в функции, если совместимый оператор выгоды отсутствует в пути к вызову функции. Если функция не задана как noexcept, Polyspace игнорирует его, если его путь к вызову испытывает недостаток в точке входа как main().
Polyspace отмечает throw оператор, который использует catch(…) оператор, чтобы обработать повышенные исключения.
Polyspace не отмечает операторы переброска, то есть, throw операторы в блоках выгоды.
У вас могут быть совместимые блоки выгоды для throw операторы в вашей функции во вложенном Polyspace блока try-catch игнорируют вложенные блоки try-catch. Выровняйте по ширине throw операторы, которые имеют совместимые блоки выгоды во вложенной структуре при помощи комментариев. В качестве альтернативы используйте один уровень try-catch в ваших функциях.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
| Группа: Обработка исключений |
| Категория: необходимый, автоматизированный |