Sto scrivendo un drop-replacement per un container, e sto cercando di ottenere tutte le garanzie di eccezione sul posto. Al momento sto scrivendo il metodo clear
e voglio completarlo il più possibile, e lasciare sempre il contenitore in uno stato coerente, anche se uno dei distruttori genera un'eccezione. Voglio anche riproporre l'eccezione dopo che ho finito di pulire, preferibilmente senza affettare.Quando un oggetto di eccezione viene distrutto (e può essere controllato)?
Questo mi porta alla domanda; quando viene distrutta un'eccezione? Diamo un'occhiata a un tentativo: Questo è semplificato per l'esempio.
void container::clear()
{
bool had_exception = false;
std::exception* exp;
internal_set_empty(); // this cant throw
while(! internal_done())
{
try
{
internal_destruct_next(); // this might throw if T::~T() throws
}
catch(std::exception& e)
{
had_exception = true;
exp = &e;
}
}
if(had_exception)
throw *exp;
}
mi aspetto che questo mal di fallire, perché l'eccezione è probabilmente distrutto se si considera manipolati, e questo non tecnicamente rethrow.
Un altro tentativo sarebbe quello di prendere una copia dell'eccezione, qualcosa che mi aspetterebbe di affettare.
C'è un modo per estendere la durata dell'eccezione in modo da poter ripensare a in seguito? Se possibile, vorrei anche essere in grado di rilanciare le eccezioni rilevate tramite catch(...)
.
http: // en.cppreference.com/w/cpp/error/exception_ptr potrebbe essere utile se lo scenario può funzionare. – Mat
@Mat 'exception_ptr' sembra esattamente quello che stavo cercando, ma sembra che ci sia un problema più fondamentale. – sp2danny