Поделиться через


Ограничения обработчиков завершения

Невозможно использовать инструкцию goto для входа в блок инструкций __try или __finally. Входить в этот блок необходимо только через обычный поток управления. (Впрочем, можно выйти из блока инструкций __try). Кроме того, невозможно вложить обработчик исключений или обработчик завершения в блок __finally.

Кроме того, некоторые типы кода, разрешенные в обработчике завершения, дают спорные результаты, поэтому их следует либо не использовать вообще, либо использовать с осторожностью. Один из них — инструкция goto, выполняющая выход из блока инструкций __finally. Если блок выполняется как часть нормального завершения, ничего необычного не происходит. Однако если система разматывает стек, эта операция останавливается, и текущая функция получает контроль над происходящим, как если бы аномального завершения не было.

Инструкция return внутри блока инструкций __finally, по сути, представляет такую же ситуацию. Контроль возвращается непосредственному вызывающему объекту функции, которая содержит обработчик завершения. Если система разматывала стек, этот процесс останавливается, и программа выполняется, как если бы исключения не было создано.

См. также

Ссылки

Написание обработчика завершения

Структурированная обработка исключений (C/C++)