Выражение присваивания оператора броска не должно самостоятельно заставлять исключение быть выданным
Выражение присваивания оператора броска не должно самостоятельно заставлять исключение быть выданным.
На C++ можно использовать throw
оператор, чтобы повысить исключения явным образом. Компилятор выполняет такой throw
оператор на двух шагах:
Во-первых, это создает аргумент для throw
оператор. Компилятор может вызвать конструктора или оценить выражение присваивания, чтобы создать объект аргумента.
Затем это повышает созданный объект как исключение. Компилятор пытается совпадать с объектом исключения к совместимому обработчику.
Если непредвиденная исключительная ситуация повышена, когда компилятор создает ожидаемое исключение в throw
оператор, непредвиденная исключительная ситуация повышена вместо ожидаемой. Рассмотрите этот код где 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
было ожидаемое исключение, блок выгоды несовместим с bad_alloc
. bad_alloc
исключение становится необработанным исключением. Это может заставить программу прерываться неправильно, не раскручивая стек, ведя к утечке ресурсов и уязвимостям системы обеспечения безопасности.Непредвиденные исключительные ситуации, являющиеся результатом аргумента throw
оператор может вызвать утечки ресурсов и уязвимости системы обеспечения безопасности. Чтобы предотвратить такой нежелательный результат, избегайте использования выражений, которые могут повысить исключения в качестве аргумента в throw
оператор.
Polyspace® отмечает выражения в throw
операторы, которые могут повысить исключение. Выражения, которые могут повысить исключения, могут включать:
Функции, которые заданы как noexcept(false)
Функции, которые содержат один или несколько явный throw
операторы
Конструкторы, которые выполняют операции выделения памяти
Выражения, которые включают динамический кастинг
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Обработка исключений |
Категория: необходимый |