http://ideone.com/UtVzxwProva sintassi cattura costruttore
struct base
{
base() { throw std::exception(); }
};
struct derived : public base
{
derived() try : base() { }
catch (std::exception& e)
{
std::cout << "exception handled" << std::endl;
}
};
int main()
{
derived a; // My app crashes.
return 0;
}
Shoun't mio app di scrittura "eccezione gestita" e prosegue la marcia?
L'unica soluzione che ho trovato è di circondare la costruzione di "a
" in un blocco try/catch. Ma se lo faccio, qual è il punto di avere il try/catch nel costruttore al primo posto? Suppongo che il suo uso sia ripulire le variabili membro che potrebbero essere state allocate? dal momento che il distruttore non viene chiamato?
Il seguente funziona, ma gestisce l'eccezione 2 volte.
struct base
{
base() { throw std::exception(); }
};
struct derived : public base
{
derived() try : base() { }
catch(std::exception& e)
{
std::cout << "exception 1" << std::endl;
}
};
int main()
{
// This works fine.
try {
derived a;
}
catch(std::exception& e)
{
std::cout << "exception 2" << std::endl;
}
return 0;
}
Sto solo cercando di chiedere a me stesso perché non dovrei semplicemente schivare la sintassi try/catch per il costruttore e scrivere questo:
struct base
{
base() { throw std::exception(); }
};
struct derived : public base
{
derived() : base() { }
};
int main()
{
// This works fine.
try {
derived a;
}
catch(std::exception& e)
{
std::cout << "exception handled" << std::endl;
}
return 0;
}
Quindi supponiamo che tu sia Google che ha la politica di non usare le eccezioni e hai trovato una biblioteca interessante, ma la classe che vuoi ereditare da una serie (solo nel costruttore, non altrove). Se ne erediti, ogni persona che usa la classe derivata deve usare try/catch ogni volta. Cosa faresti in questo caso? Sembra che l'unica risposta sia: usare un'altra libreria, solo a causa del costruttore ... – James
@Phantom o non ereditarlo, fare un puntatore ad esso un membro e inizializzarlo nel corpo del costruttore. Ma credo che in Google non ti permetteranno comunque di usare quella libreria. –