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


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

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

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

Исключения могут быть либо аппаратными, либо программными. Даже если приложения не могут полностью восстановиться из аппаратных или программных исключений, структурированная обработка исключений позволяет регистрировать и отображать сведения об ошибках. Полезно захватить внутреннее состояние приложения, чтобы помочь диагностировать проблему. В частности, полезно для периодических проблем, которые не легко воспроизвести.

Синтаксис

try-except-statement:
__try compound-statement __except ( expression ) compound-statement

Составной оператор после __try предложения является защищенным разделом. Составной оператор после __except предложения является обработчиком исключений. Обработчик задает набор действий, выполняемых при возникновении исключения во время выполнения защищенного раздела. Выполнение выполняется следующим образом:

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

  2. Если исключение не возникает во время выполнения защищенного раздела, выполнение продолжается по инструкции __except после предложения.

  3. Если исключение возникает во время выполнения защищенного раздела или в любой подпрограмме вызовов защищенного раздела, __except выражение вычисляется. Возвращаемое значение определяет, как обрабатывается исключение. Есть три возможных значения :

    • EXCEPTION_CONTINUE_SEARCH: исключение не распознано. Продолжайте поиск по стеку обработчика, сначала для содержащих try-except операторов, а затем обработчиков со следующим самым высоким приоритетом.

    • EXCEPTION_CONTINUE_EXECUTION: исключение распознается, но отклонено. Продолжить выполнение в точке, в которой произошло исключение.

    • EXCEPTION_EXECUTE_HANDLER Исключение распознается. Перенесите управление в обработчик исключений, выполнив __except составную инструкцию, а затем продолжайте выполнение в точке возникновения исключения.

__except Так как выражение оценивается как выражение C, оно ограничено одним значением, оператором условного выражения или оператором запятой. Если требуется более обширная обработка, выражение может вызвать подпрограмму, которая возвращает одно из трех значений, перечисленных выше.

Замечание

Структурированная обработка исключений работает с исходными файлами C и C++. Однако он не предназначен специально для C++. Для переносимых программ C++ следует использовать обработку исключений C++ вместо структурированной обработки исключений. Кроме того, механизм обработки исключений C++ гораздо более гибкий, так как он может обрабатывать исключения любого типа. Дополнительные сведения см. в разделе " Обработка исключений " в справочнике по языку C++.

Каждая подпрограмма в приложении может иметь собственный обработчик исключений. Выражение __except выполняется в области __try текста. Он имеет доступ к любым локальным переменным, объявленным там.

Ключевое __leave слово допустимо в блоке инструкций try-except . Эффект __leave заключается в переходе к концу try-except блока. Выполнение возобновляется после окончания обработчика исключений. Несмотря на goto то, что оператор может использоваться для выполнения одного и того же результата, goto оператор вызывает очистку стека. Оператор __leave более эффективен, так как он не включает очистку стека.

Выход из инструкции try-except с помощью longjmp функции времени выполнения считается ненормальным завершением. Это не законно, чтобы перейти к __try заявлению, но это законно выскочить из одного. Обработчик исключений не вызывается, если процесс убит в середине выполнения try-except инструкции.

Пример

Ниже приведен пример обработчика исключений и обработчика завершения. Дополнительные сведения о обработчиках завершения см try-finally . в инструкции (C).

.
.
.
puts("hello");
__try {
   puts("in try");
   __try {
      puts("in try");
      RAISE_AN_EXCEPTION();
   } __finally {
      puts("in finally");
   }
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
   puts("in except");
}
puts("world");

Ниже приведены выходные данные из примера с комментариями, добавленными справа:

hello
in try              /* fall into try                        */
in try              /* fall into nested try                 */
in filter           /* execute filter; returns 1 so accept  */
in finally          /* unwind nested finally                */
in except           /* transfer control to selected handler */
world               /* flow out of handler                  */

END Microsoft-specific

См. также

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