Come posso catturare una chiamata fiscata non valida come un'eccezione C ++ su Windows?
-
15-11-2019 - |
Domanda
In Visual C ++ 2008, voglio "catturare" un'eccezione generata come mostrato qui:
try {
int foo = 20;
::fgetpos(0, (fpos_t*)&foo);
}
//...
.
Qui ci sono aggiustamenti che ho fatto per tentare un attacco riuscito:
- .
- seh è attivato (/ eha)
- Ho aggiunto un fermo (...)
- Ho aggiunto un _set_se_translator Vector.
- Ho aggiunto / regolato alla sintassi seh: __try / __except (Except_execute_Handler)
In breve, ho provato "tutto nel libro" e non riesco ancora a prendere l'eccezione. Se sostituisco la chiamata su
::fgetpos
conint hey = foo / 0
, improvvisamente tutte le tecniche di cui sopra lavorano come previsto. Quindi l'eccezione con cui ci ha a che fare da::fgetpos
è in qualche modo "extra speciale".Qualcuno può spiegare perché questo :: errori di fogapose sembra non compatibile e come lavorarlo?
Aggiornamento Se eseguito in VS IDE, la finestra di uscita non nomina un'eccezione. Tutto ciò che dice è questo:
.
Microsoft Visual Studio C Runtime Library ha rilevato un errore irreversibile in MyProgram.exe.
Non molto utile. Quando eseguo l'app console dalla riga di comando, ottengo un dialogo di crash. La sezione "Dettagli del problema" del dialogo include queste informazioni:
.
Nome dell'evento problema: Bex
Offset eccetion: 0002FD30
Codice di eccezione: C0000417
Dati di eccezione: 00000000
Ulteriori informazioni 1: 69AD
Ulteriori informazioni 2: 69ADDFB19767B2221C8E3E7A5CD2F4AE
Ulteriori informazioni 3: B1FF
Ulteriori informazioni 4: B1FFCA30CADDDC78C19F19B6D150997F
Soluzione
Since the code in your dump corresponds to STATUS_INVALID_CRUNTIME_PARAMETER
, try _set_invalid_parameter_handler
Altri suggerimenti
Most likely, the runtime catches it for you and issues a debug dialog without returning or propagating the exception- that is a CRT call and they may add whatever exception catching code in there they like. It's well within Visual Studio's rights to catch a hardware exception inside a library function, especially if you are running from within the IDE or in debug mode, then it is expected of the runtime.
Of course, when you divide by zero, then there is no library call here to write that extra catching code.