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


инструкция try-finally (C)

Корпорация Майкрософт

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

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

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

Элемент управления достигает инструкции по простому __try последовательному выполнению (падение). Когда элемент управления вводит инструкцию, связанный __try обработчик становится активным. Выполнение выполняется следующим образом:

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

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

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

Ключевое __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-except, чтобы узнать, как try-finally работает инструкция.

END Microsoft-specific

См. также

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