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


попытк-за исключением выписки

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

следующий синтаксис описывает a попытк-за исключением выписки:

__try 
{
   // guarded code
}
__except ( expression )
{
   // exception handler code
}

Заметки

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

Дополнительные сведения см. в разделе оператор попытки-окончательн.

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

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

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

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

  1. Защищенный раздел выполнен.

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

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

    EXCEPTION_CONTINUE_EXECUTION (- 1)   исключение закрыто.Продолжить выполнение в точке, где произошло исключение.

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

    EXCEPTION_EXECUTE_HANDLER (1)   исключение.Управление передачи обработчику исключений, выполнив __except составной оператор, затем продолжает выполняться после __except блок.

Посколькуexcept выражение вычисляется в качестве выражения c, оно ограничено одним значением " условного выражения или оператору запятой.Если значительный обработки, то выражение может вызывать процедуру, которая возвращает одно из 3 значений, перечисленных выше.

Каждое приложение может иметь собственный обработчик исключений.

Он недопустим для поскакать в выражении __try выписка, но допустимый для поскакать из них.Обработчик исключений не вызывается, если процесс завершен в середине выполнения a try-except выписка.

Дополнительные сведения см. в статье базы знаний майкрософт: Q315937 КАК переполнение стека ловушки в приложении Visual C++.

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

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

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

s58ftw19.collapse_all(ru-ru,VS.110).gifСтруктурные встроенные функции обработки ошибок

Структурная обработка исключений предоставляет 2 встроенных функций, которые доступны для использования с try-except оператор: GetExceptionCode и GetExceptionInformation.

GetExceptionCode возвращает Код (32 бита целое число) исключения.

Встроенная функция GetExceptionInformation возвращает указатель на структуру, содержащую дополнительные сведения об исключении.С помощью этого указателя можно получить доступ к состояние компьютера, которое существовало в момент аппаратного исключения.структура следующим образом:

struct _EXCEPTION_POINTERS {
      EXCEPTION_RECORD *ExceptionRecord,
      CONTEXT *ContextRecord }

_Типов указателяEXCEPTION_RECORD и _Контекст укажите в файле EXCPT.H. include.

Можно использовать GetExceptionCode в обработчике исключений.Однако можно использовать GetExceptionInformation только в пределах выражения фильтра исключения.Сведения оно указывает на обычно в стеке и больше недоступно, когда элемент управления передается в обработчик исключений.

Встроенная функция AbnormalTermination доступен в обработчик завершения.Возвращает 0, если текст сообщения try-finally оператор завершается последовательно.Во всех остальных случаях возвращается 1.

EXCPT.H определяет некоторые другие имена этих встроенных функций:

GetExceptionCode эквивалентен _exception_code

GetExceptionInformation эквивалентен _exception_information

AbnormalTermination эквивалентен _abnormal_termination

Пример

// exceptions_try_except_Statement.cpp

// Example of try-except and try-finally statements

#include <stdio.h>

#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION

#include <excpt.h>

int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {

   puts("in filter.");

   if (code == EXCEPTION_ACCESS_VIOLATION) {

      puts("caught AV as expected.");

      return EXCEPTION_EXECUTE_HANDLER;

   }

   else {

      puts("didn't catch AV, unexpected.");

      return EXCEPTION_CONTINUE_SEARCH;

   };

}

int main()

{

   int* p = 0x00000000;   // pointer to NULL

   puts("hello");

   __try{

      puts("in try");

      __try{

         puts("in try");

         *p = 13;    // causes an access violation exception;

      }__finally{

puts("in finally. termination: ");

puts(AbnormalTermination() ? " \tabnormal" : "\tnormal");

      }

   }__except(filter(GetExceptionCode(), GetExceptionInformation())){

      puts("in except");

   }

   puts("world");

}

Output

hello
in try
in try
in filter.
caught AV as expected.
in finally. termination:
        abnormal
in except
world

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

См. также

Ссылки

Написать обработчик исключений

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

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