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