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


Оператор try-finally (C)

Только для систем Майкрософт

Оператор try-finally является расширением Microsoft для языка C и позволяет приложениям гарантировать выполнение кода очистки при прерывании выполнения блока кода. Очистка включает такие задачи, как отмена распределения памяти, закрытие файлов и освобождение их дескрипторов. Оператор try-finally особенно полезен для подпрограмм, в которых в нескольких местах выполняется проверка на наличие ошибок, способных вызвать преждевременное возвращение из подпрограммы.

try-finally-statement:
__try compound-statement __finally compound-statement

Составной оператор после предложения __try — это защищенный раздел. Составной оператор после предложения __finally является обработчиком завершения. Такой обработчик определяет набор действий, выполняемых при выходе из защищенного раздела, независимо от того, происходит ли выход в результате исключения (ненормальное завершение) или в результате стандартной передачи управления дальше (нормальное завершение).

Управление переходит к оператору __try в процессе обычного последовательного выполнения (передачи управления дальше). При достижении оператора __try становится активным связанный обработчик. Выполнение происходит следующим образом:

  1. Сначала выполняется защищенный раздел.

  2. Вызывается обработчик завершения.

  3. По окончании работы обработчика завершения выполнение продолжается после оператора __finally. Независимо от того, как завершается защищенный раздел (например, оператором выхода из защищенного тела goto или оператором return), перед выходом потока управления из защищенного раздела выполняется обработчик завершения.

В блоке операторов __leave можно использовать ключевое слово try-finally. Результат использования __leave — переход в конец блока try-finally. Сразу же выполняется обработчик завершения. Хотя для получения того же результата можно использовать оператор goto, он (оператор goto) приводит к освобождению стека. Оператор __leave более эффективен, так как он не вызывает раскрутку стека.

Выход из оператора try-finally с помощью оператора return или функции longjmp во время выполнения считается ненормальным завершением. Переход к инструкции __try недопустим, но выход из него допускается. Все операторы __finally, которые активны между исходной точкой и точкой назначения, должны быть выполнены. Это называется локальной раскруткой.

Если при выполнении оператора try-finally процесс удаляется, обработчик завершения не вызывается.

Примечание.

Структурированная обработка исключений поддерживается с исходными файлами C и C++. Но она не предназначена специально для C++. Для переносимых программ C++ вместо структурированной обработки исключений следует использовать обработку исключений C++. Кроме того, механизм обработки исключений C++ обеспечивает намного более высокую гибкость, поскольку может обрабатывать исключения любого типа. Дополнительные сведения см. в разделе Обработка исключений в справочнике по языку C++.

Чтобы увидеть, как работает оператор try-finally, см. пример для оператора try-except.

КОНЕЦ Только для систем Майкрософт

См. также

Оператор try-finally (C++)