2009-09-03 8 views
14

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:

  1. 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.)

  2. 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

risposta

11

per quanto ne so non gettare un'eccezione ... almeno non quelle standard!

Forse cattura-finestre specifiche eccezioni "nativo" aiuterebbero: http://www.gamedev.net/reference/articles/article2488.asp

+0

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 !! –

+4

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

+0

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

0

Ciò che si descrive assomiglia molto :: terminate() viene chiamato dal runtime C++.

Questo è di solito causata da un cosiddetto doppia eccezione - da qualche parte viene generata un'eccezione, pila svolgimento inizia e in uno dei distruttori invocati durante la pila svolgimento lancia anche un'eccezione. In questo caso :: viene chiamato terminate() e non si può veramente aiutare il programma.

Se questo è il caso, l'unico modo per aggirare è ottenere una nuova versione della libreria dove le eccezioni non sono lasciate all'esterno dei distruttori. Puoi verificarlo abbastanza facilmente - dopo che la libreria è stata caricata call :: set_terminate() e fornire la tua funzione e controllare se viene chiamata prima che il programma si arresti.

1

Se siete su piattaforma Windows si potrebbe provare a guardare __try

Si noti tuttavia che non c'è molto uso in continuo di esecuzione se non si è veramente sicuri di poter isolare e gestire l'eccezione.

8

Una violazione di accesso non è un'eccezione C++. È un'eccezione strutturata di Windows. Dovrai usare _set_se_translator() se vuoi catturarli in catch (...).

Probabilmente dovresti cercare google per tutte le ragioni (...) è malvagio e assicurati di volerlo davvero fare.

+0

Questo è un bel po 'di informazioni ... nel mio caso, tuttavia, sembra che devo usare _set_se_translator() nella funzione main() (almeno secondo l'esempio nell'articolo a cui si fa riferimento da sharptooth sopra) .. Una cosa che non ho menzionato è che il mio codice è in realtà un oggetto com caricato da un'altra applicazione (l'applicazione di terze parti, infatti) e non ho il controllo sul main() che è in uso. Altrimenti penso che questa sarebbe stata la strada migliore. –

+0

Ooops Intendo riferimento nell'articolo di Klaim. scusa! –

Problemi correlati