попытк-за исключением выписки
Только для систем Microsoft
следующий синтаксис описывает a попытк-за исключением выписки:
__try
{
// guarded code
}
__except ( expression )
{
// exception handler code
}
Заметки
try-except выписка расширения Майкрософт для языков c и C++, позволяет приложениям целевого объекта регулирование коэффициента усиления если события, которые обычно завершают выполнение программы.Такие события вызываются исключениями, и механизмом, с исключениями делам вызывают структурной обработкой ошибок.
Дополнительные сведения см. в разделе оператор попытки-окончательн.
Исключения могут быть или оборудования или программного обеспечения.Даже если приложения не могут полностью восстановить из исключений оборудования или ошибок программного обеспечения, структурная обработка исключений позволяет вывести сведения об ошибке и нажатие внутреннее состояние приложения помочь диагностировать проблему.Это особенно полезно для прерывистых проблем, которые не могут быть легко воспроизведенным.
Примечание |
---|
Структурная обработка исключений работает с Win32 и для исходных файлов c и C++.Однако она не предназначена для C++.Можно убедиться, что Код портативне с помощью обработки исключений C++.Кроме того, обработка исключений С++ является более гибким, что он может обрабатывать исключения любого типа.Для программ C++, рекомендуется использовать механизм обработки исключений C++ (попытка, catch, и выполнение выписки). |
Составной оператор после __try предложение текст сообщения или защищенный разделе.Составной оператор после __except предложение обработчик исключений.Обработчик задает набор действий для выполнения при возникновении исключения во время выполнения текста защищенного раздела.выполнение продолжает следующим образом:
Защищенный раздел выполнен.
Если исключение не возникло во время выполнения защищенного раздела, то выполнение продолжается после при выписке __except предложение.
Если исключение возникло во время выполнения защищенного раздела или в любой процедуре, то вызывает защищенный раздел __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 выписка поскольку менее вероятно, чтобы совершить ошибка программирования если защищенный раздел большой или сложный.
Структурные встроенные функции обработки ошибок
Структурная обработка исключений предоставляет 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
ЭЛЕМЕНТ, относящийся Майкрософт
См. также
Ссылки
Написать обработчик исключений