Ho una libreria di terze parti che a volte genera un'eccezione. Così ho deciso di racchiudere il mio codice in un try/catch (...) in modo che potessi registrare le informazioni sull'eccezione (nessun dettaglio specifico, solo che fosse accaduto.)Impossibile intercettare l'eccezione C++ utilizzando il catch (...)
Ma per qualche motivo, il codice ancora si blocca. Nei computer client, si arresta in modo anomalo e il codice per registrare l'eccezione nel catch (...) non viene mai eseguito. Se lo eseguo sul mio debug/macchina di sviluppo ottengo il popup che mi chiede se voglio eseguire il debug. Quando eseguo questa operazione, segnala 0xC0000005: Posizione di lettura della violazione di accesso XXX.
La cosa strana è che con una versione precedente della libreria di terze parti, lo stesso identico codice cattura l'eccezione e il codice per registrare l'eccezione viene eseguito. (Ho verificato questo all'interno di VS guardare si verificano le stesse condizioni.)
Ecco il pseudo-codice che sta eseguendo:
Così ho due domande:
C'è qualche cambiamento nel modo in cui la terza parte avrebbe potuto compilare la libreria in modo che il mio codice non fosse in grado di rilevare l'eccezione? (Sì, c'è una possibilità che riesca a convincere la terza parte a fare le correzioni necessarie e ricompensare per me, se so cosa dire loro.)
Supponendo che non riesca a far riparare la terza parte , cosa posso fare per cogliere queste eccezioni? Sto pensando sulla falsariga di ... c'è un modo per me per determinare se pObject è stato deallocato? violazione di accesso
Wow questo è un articolo DAVVERO utile, e in realtà contiene una soluzione praticabile per me ... la vecchia libreria doveva essere costruita sotto VS2003, e la nuova libreria è pensata per VS2008 - la differenza fondamentale. Dopo aver impostato la libreria per la compilazione con l'opzione "Abilita eccezioni C++: Sì con Eccezioni SEH (/ EHa)" il mio codice ora cattura questa istanza. Per questo motivo sto dando a questa risposta la risposta corretta. Voglio dire, tuttavia, che molte delle altre risposte forniscono valide informazioni utili, in particolare quella su "non è molto utile continuare ..." quindi grazie a tutti !! –
Generalmente è una cattiva idea catturare le eccezioni SEH con C++ try/catch. C'è un motivo per cui MS lo ha disabilitato di default nei loro nuovi compilatori. In generale, dovresti usare i costrutti SEH (come __try/__ tranne) piuttosto che abilitare l'opzione del compilatore. – jalf
Michael Bray> Nessun problema, immagino ci siano molte risposte qui che aiutano in questo tipo di problemi. Voterò anche per gli altri per inventarli appena sotto questa risposta. jalf> Infatti. Questo è quello che fanno nell'articolo. – Klaim