Let dire che ho classe RAII:C++ utilizzando RAII con distruttore che lancia
class Raii {
Raii() {};
~Raii() {
if (<something>) throw std::exception();
}
};
E se ho la funzione:
void foo() {
Raii raii;
if (something) {
throw std::exception();
}
}
Questo è un male, perché durante la pulizia per la prima eccezione che possiamo lanciare di nuovo e questo interromperà il processo.
La mia domanda è: qual è uno schema valido per utilizzare raii per il codice che la pulizia potrebbe generare?
Ad esempio, questo è buono o cattivo: perché?
class Raii {
Raii() {};
~Raii() {
try {
if (<something>) throw std::exception();
}
catch (...) {
if (!std::uncaught_exception())
throw;
}
}
};
Si noti che l'oggetto Raii è sempre un oggetto assegnato allo stack e questo non è il problema generale del problema del distruttore.
Questo non è affatto diverso dal caso più generale di "come impedire la chiusura se ho una classe il cui distruttore può lanciare". Non penso che ci sia una buona risposta se non "i distruttori dovrebbero * non * lanciare". – sfjac
Senza il distruttore che fa del lavoro non c'è RAII. Spero davvero che ci sia qualcosa che potrebbe essere fatto. Dì qualcosa basato su std :: uncaught_exception dove puoi rilevare se c'è un'eccezione in corso, per esempio. – gsf