shodan, hai detto una cosa giusta ma incompleta
semplicemente il tipo di exception è "unsigned long" (o DWORD), ma per essere catturata devi impostare il compilatore con /xSHa (lo trovi nelle Proprietà Progetto, suppongo tu usi Visual c++).
Per controllare anche le eccezioni di virgola mobile (inclusa la divisione per 0 tra interi, seppure non siano float), devi attivare un'altra flag, la trovi cercando un po' di pagine di proprietà.
Se sai che dovrai usare solo eccezioni hardware puoi cambiare il codice così:
codice:
__try {
//codice che potrebbe generare eccezioni
} __except(ExceptionFilter(GetExceptionInformation())) {
//fa nulla, dato che il grosso è fatto in exceptionfilter
}
DWORD ExceptionFilter(EXCEPTION_POINTER* info) {
LPTSTR message = NULL;
DWORD flags = FORMAT_MESSAGE_ALLOCATE_BUFFERS|FORMAT_MESSAGE_ARGUMENT_ARRAY;
if(info->ExceptionRecord->ExceptionCode & 0x40000000) {
flags = flags | FORMAT_MESSAGE_FROM_HMODULE;
} else {
flags = flags | FORMAT_MESSAGE_FROM_SYSTEM;
}
FormatMessage(flags,GetModuleHandle(NULL),info->ExceptionRecord->ExceptionCode,0,(LPTSTR)&message,50,(va_list *)info->ExceptionRecord->ExceptionInformation);
int retval = MessageBox(NULL,message,TEXT("Exception"),MB_ABORTRETRYIGNORE|MB_ICONERROR|MB_TASKMODAL);
switch(retval) {
case IDABORT:
ExitProcess(-1);
return 0; //per alcuni compilatori che si lamentano dell'assenza di valore di ritorno
case IDRETRY:
return EXCEPTION_CONTINUE_EXECUTION;
case IDIGNORE;
return EXCEPTION_EXECUTE_HANDLER;
}
}