На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Using an Exception Handler



The following example shows a version of the standard C strcpy function that can handle an invalid pointer and return NULL if one is encountered.

Note that this exception handler is intended to handle an access-violation exception, but is inappropriate if some other type of exception occurs. Therefore, the filter expression in the example uses the GetExceptionCode function to check the exception type before executing the handler. This enables the system to continue its search for an appropriate handler if some other type of exception occurs.
Note also that there is no problem with using a return statement in the try block of a try-except statement. This differs from the use of return in the try block of a try-finally statement, which causes an abnormal termination of the try block.

LPTSTR SafeStrcpy(LPTSTR lpszString1, LPTSTR lpszString2) {
try {
return strcpy(string1, string2);
}
except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER :
EXCEPTION_CONTINUE_SEARCH ) {
return NULL;
}
}


The following example shows the interaction of nested try-finally and try-except statements. The RaiseException function causes an exception in the guarded body of a try-finally termination handler that is inside the guarded body of a try-except exception handler. The exception causes the system to evaluate the FilterFunction function, whose return value in turn causes the exception handler to be invoked. However, before the exception-handler block is executed, the finally block of the termination handler is executed because the flow of control has left the try block of the termination handler.


DWORD FilterFunction() {
printf("1 "); // printed first
return EXCEPTION_EXECUTE_HANDLER;
}

VOID main(VOID) {
try {
try {
RaiseException(1, // exception code
0, // continuable exception
0, NULL); // no arguments
}
finally {
printf("2 ") // this is printed second
}
}

except ( FilterFunction() ) {
printf("3\n"); // this is printed last
}
}



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Использование Исключительного Вручителя



Следующий пример показывает версию стандарта C strcpy функция, которая может прооперировать неправильный указатель и возвращать НЕДЕЙСТВИТЕЛЬНЫЙ если один столкнулся.

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

LPTSTR SafeStrcpy(LPTSTR lpszString1, LPTSTR lpszString2) { ПОПЫТКА {
возврат strcpy(string1, string2);
}
кроме (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH ) { обратный НЕДЕЙСТВИТЕЛЬНЫЙ;
}
}


Следующий пример показывает взаимодействие вложенной попытки-наконец и попытка-кроме утверждений. Функция RaiseException вызывает исключение в охраняющее тело попытки-наконец завершения вручителя, которое - в охраняющем теле попытки-кроме исключительного вручителя. Исключение заставляет систему, чтобы оценивать функцию FilterFunction, чья обратная величина в свою очередь вызывает исключительного вручителя, который нужно вводиться. Тем не менее, прежде, чем блок исключительного вручителя будет выполнен, наконец блок вручителя завершения выполнен поскольку поток управления оставил пробовать блока вручителя завершения.


DWORD FilterFunction() {
printf("1 "); // отпечатанный первый возврат EXCEPTION_EXECUTE_HANDLER;
}

НЕДЕЙСТВИТЕЛЬНАЯ основа(ПУСТОТА) { попытка { пытаться {
RaiseException(1, // ИСКЛЮЧИТЕЛЬНЫЙ код 0, // continuable исключение 0, НЕДЕЙСТВИТЕЛЬНОЕ); // никакие аргументы
}
наконец {
printf("2 ") // это напечатан секунда
}
}

кроме ( FilterFunction() ) { printf("3\n"); // это печатается последний раз
}
}



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz