выписка try - окончательн

Только для систем Microsoft

Следующий синтаксис описывает try-finally оператор:

__try {
   // guarded code
}
__finally {
   // termination code
}

Грамматика

  • попытк-окончательн-выписка.
    __try* составной оператор*

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

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

Дополнительные сведения и образец кода см. в разделе попытк-за исключением выписки.Дополнительные сведения о структурной обработке исключений в целом см. в разделе Структурная обработка исключений.Дополнительные сведения об обработке исключений в управляемых приложениях см. в разделе Обработка ошибок при использовании параметра /clr.

ПримечаниеПримечание

Структурная обработка исключений работает с Win32 и для исходных файлов c и C++.Однако она не предназначена для C++.Можно убедиться, что Код портативне с помощью обработки исключений C++.Кроме того, обработка исключений С++ является более гибким, что он может обрабатывать исключения любого типа.Для программ C++, рекомендуется использовать механизм обработки исключений C++ (попытка, catch, и выполнение выписки).

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

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

  1. Обработчик завершения вызова.

  2. Когда обработчик завершения завершает выполнение продолжается после __finally выписка.Независимо от того, как защищаются раздел завершение (например, через a goto из защищенных текста или a return выписка), обработчик завершения выполняется before поток элемента управления перемещается из защищенного раздела.

    A __finally выписка не блокирует поиска соответствующего обработчика исключений.

Если исключение возникает в __try блок, операционная система должен найти обработчик исключения или программы завершится ошибкой.Если обработчик найден, то есть и все __finally блоки выполнения и возобновляет выполнение в системе.

Например, ряд функций a ссылок вызовов функций для функционирования D, как показано на следующем рисунке.Каждая функция имеет один обработчик завершения.Если исключение возникает в D функции и обрабатывается в выражении, обработчики завершения вызываются в указанном порядке по мере того, как система очистки стека: D, C, B.

Порядок выполнения Прекращени-Обработчика

Порядок ликвидации операций обработчика

ПримечаниеПримечание

Реакция на событие попытки-окончательн отличается от некоторых других языков, для которых поддерживается использование Наконецв c#.Одно __try может иметь то, но не из обоих __finally и __except.Если необходимо использовать вместе, то внешняя попытк-за исключением выписки должна быть внутреннюю выписку попытки-окончательн.Правила, определяющее, когда каждый фрагмент выполняет также различаются.

ключевое слово __leave

__leave ключевое слово допустимо только внутри защищенный раздел a try-finally выписка и его влияние поскакать в конец защищенного раздела.Выполнение продолжается на первой выписке в обработчике завершения.

A goto оператор может также поскакать из защищенного раздела, но снижает производительность, поскольку она вызывает очистки стека.__leave выписка более эффективны, поскольку он не вызывает очистки стека.

Анормалное завершение

Оставить a try-finally выписка использование longjmp функция среды выполнения, считается анормалным нулем.Недопустимо поскакать в выражении __try выписка, но юридическая поскакать из них.Все __finally выписки, которые активны между отправным точкой (нормальным завершением __try блок и назначение () __except отключите, который обрабатывает исключение) должны выполняться.Это называется локальным очистки.

Если набор узлов a Try блок преждевременно завершить по какой-либо причине, включая гиперссылки из блока, система выполняет связанное Наконец блок как часть процесса очистки стека.В таких случаях AbnormalTermination функция возвращает значение true, если вызывается из Наконец блок; в противном случае возвращается значение FALSE.

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

ЭЛЕМЕНТ, относящийся Майкрософт

См. также

Ссылки

Написать обработчик завершения

Структурная обработка исключений (C++)

Ключевые слова C++

Termination-Handler Syntax