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


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

Блок, относящийся только к системам Microsoft

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

  • оператор-try-finally:
    __try составной-оператор

    __finally составной-оператор

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

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

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

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

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

В блоке оператора try-finally можно использовать ключевое слово __leave. Результат использования __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.

Завершение блока, относящегося только к системам Microsoft

См. также

Ссылки

Оператор try-finally