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