Назначение-выражение оператора throw само по себе не должно вызывать выдачу исключения
Выражение назначения оператора throw само по себе не должно вызывать выдачу исключения.
В C++ можно использовать throw
оператор для явного возбуждения исключений. Компилятор выполняет такое throw
оператор в два шага:
Во-первых, он создает аргумент для throw
оператор. Компилятор может вызвать конструктор или вычислить выражение назначения, чтобы создать объект аргумента.
Затем он поднимает созданный объект как исключение. Компилятор пытается сопоставить объект исключения с совместимым обработчиком.
Если при создании компилятором ожидаемого исключения в throw
возникает непредвиденное исключение оператор, непредвиденное исключение возникает вместо ожидаемого. Рассмотрим этот код, где a
throw
оператор вызывает явное исключение класса myException
.
class myException{ myException(){ msg = new char[10]; //... } //... }; foo(){ try{ //.. throw myException(); } catch(myException& e){ //... } }
myException
объект, new
оператор может поднять bad_alloc
исключение. В таком случае throw
оператор поднимает bad_alloc
исключение вместо myException
. Потому что myException
было ожидаемым исключением, блок catch несовместим со bad_alloc
. The bad_alloc
исключение становится необработанным исключением. Это может привести к ненормальному прекращению работы программы без размотки стека, что приведет к утечке ресурсов и уязвимостям безопасности.Неожиданные исключения, возникающие из аргумента throw
оператор может вызвать утечки ресурсов и уязвимости безопасности. Чтобы предотвратить такой нежелательный результат, избегайте использования выражений, которые могут вызвать исключения в качестве аргумента в throw
оператор.
Polyspace® помечает выражения в throw
операторы, которые могут вызвать исключение. Выражения, которые могут вызвать исключения, могут включать:
Функции, которые заданы как noexcept(false)
Функции, которые содержат одно или несколько явных throw
операторы
Конструкторы, которые выполняют операции выделения памяти
Выражения, которые включают динамическое литье
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Обработка исключений |
Категория: Необходимый, Автоматизированный |