ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
11 июля
350355 Топик полностью
Ксения (30.08.2012 14:20 - 14:26, просмотров: 172) ответил fk0 на #include <signal.h> int div(int x, int y) { if (!y) raise(SIGFPE); return x/y; } -- соответственно через signal(SIGFPE, handler...) перехватывать, и делать, например longjmp вместо throw и setjmp ранее вместо catch. Именно прерывание не нужно.
Я это делаю не средствами языка/среды, а средствами Windows-API, которые позволяют обрабатывать такие ситуации: 1) создаю СВОЮ функцию-обработчик: long WINAPI ExceptionFilter( PEXCEPTION_POINTERS) { ... } которая будет вызываться при исключениях. 2) Знакомлю с ней Windows: SetUnhandledExceptionFilter( ExceptionFilter); - это функция Windows-API, переключающая исключения на другой обработчик (в данном случае мой). 3) Внутри своего обработчика пишу: long WINAPI ExceptionFilter( PEXCEPTION_POINTERS ExceptionInfo) { EXCEPTION_RECORD *p = ExceptionInfo->ExceptionRecord; _CONTEXT *r = ExceptionInfo->ContextRecord; switch( p->ExceptionCode ) { ... // другие случаи исключений case STATUS_FLOAT_DIVIDE_BY_ZERO: тут пишу, что делать return EXCEPTION_CONTINUE_EXECUTION; // продолжить далее по программе case STATUS_FLOAT_INVALID_OPERATION: тут пишу, что делать return EXCEPTION_CONTINUE_EXECUTION; // продолжить далее по программе } } Если же хочу, чтобы на C++ вывалилось на throw, то так напрямую и вызываю throw() с объявлением. Например: wsprintf( msg, "Exception 0x%X: %s\n" "EIP=0x%08X\n" "EAX=0x%08X EBX=0x%08X ECX=0x%08X EDX=0x%08X\n" "ESI=0x%08X EDI=0x%08X\n" "EBP=0x%08X ESP=0x%08X\n" "EFL=0x%08X\n", p->ExceptionCode, txt, r->Eip, r->Eax, r->Ebx, r->Ecx, r->Edx, r->Esi, r->Edi, r->Ebp, r->Esp, r->EFlags); MessageBox( NULL, msg, "INTERNAL ERROR", MB_OK); _clear87(); // сброс FPU с забываним содержимого стеков throw txt;