Оператор try-finally (C)
Только для систем Майкрософт
Оператор try-finally
является расширением Microsoft для языка C и позволяет приложениям гарантировать выполнение кода очистки при прерывании выполнения блока кода. Очистка включает такие задачи, как отмена распределения памяти, закрытие файлов и освобождение их дескрипторов. Оператор try-finally
особенно полезен для подпрограмм, в которых в нескольких местах выполняется проверка на наличие ошибок, способных вызвать преждевременное возвращение из подпрограммы.
try-finally-statement
:
__try
compound-statement
__finally
compound-statement
Составной оператор после предложения __try
— это защищенный раздел. Составной оператор после предложения __finally
является обработчиком завершения. Такой обработчик определяет набор действий, выполняемых при выходе из защищенного раздела, независимо от того, происходит ли выход в результате исключения (ненормальное завершение) или в результате стандартной передачи управления дальше (нормальное завершение).
Управление переходит к оператору __try
в процессе обычного последовательного выполнения (передачи управления дальше). При достижении оператора __try
становится активным связанный обработчик. Выполнение происходит следующим образом:
Сначала выполняется защищенный раздел.
Вызывается обработчик завершения.
По окончании работы обработчика завершения выполнение продолжается после оператора
__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
.
КОНЕЦ Только для систем Майкрософт