Non sono sicuro se questo è un problema con il compilatore o se sto facendo qualcosa di sbagliato. Sto usando il compilatore di Visual Studio 2013.Costruttore come blocco try di una funzione - Programma di interruzione di eccezioni
Ho una classe in cui ho bisogno di acquisire una quantità significativa di risorse nel mio elenco di inizializzatore costruttore la maggior parte delle quali può generare un'eccezione. Ho concluso l'elenco di inizializzazione dei membri in un blocco di prova della funzione e ho rilevato l'eccezione lì. Ma il mio programma abortisce anche se la clausola catch non rigenera l'eccezione. Non sono autorizzato a pubblicare il codice effettivo. Quindi ho riprodotto il problema con questo codice demo equivalente. Qualcuno può aiutarmi ad aiutarmi?
#include <iostream>
using namespace std;
class A{
public:
A() try : i{ 0 }{ throw 5; }
catch (...){ cout << "Exception" << endl; }
private:
int i;
};
int main(){
A obj;
}
Durante l'esecuzione di questo codice viene visualizzato un avviso di Windows "abort() è stato chiamato". Quindi immagino che il sistema lo tratti come un'eccezione non rilevata e che chiama terminate().
D'altra parte se avvolgo la costruzione dell'oggetto in main() in un blocco try-catch, l'eccezione viene rilevata correttamente e il programma termina normalmente.
Qualcuno può dirmi se sto facendo qualcosa di sbagliato qui?
sguardo http://www.gotw.ca/gotw/066.htm per una discussione su questo problema –
Grazie mille Jan Herrmann. Ovviamente lo standard ha molto senso affermare che se un'eccezione non viene rimessa in gioco o se una nuova eccezione non viene lanciata dalla funzione, prova il blocco del costruttore, quindi verrà automaticamente retrocesso alla fine del blocco catch. Questo ha perfettamente senso ora. Forse come l'idioma pimpl suggerito è quello che dovrei iniziare a usare. Grazie mille ancora – Madhusudhan
Punti extra per * "Non sono autorizzato a pubblicare il codice effettivo. Così ho riprodotto il problema con questo codice demo equivalente. "* Hai fatto un ottimo [MCVE] (https://stackoverflow.com/help/mcve). – 5gon12eder