Risposta semplice, non consentire mai un'eccezione da un operatore!
La risposta complicata. Si ottiene veramente inchiodati se l'eccezione sfugge al dtor mentre è attiva un'altra eccezione. Il caso normale è quando stai già srotolando lo stack da un'altra eccezione e l'oggetto in questione viene distrutto. In tal caso, se l'eccezione sfugge all'operatore allora viene chiamato std::terminate
, si noti che è possibile inserire il proprio gestore per std::terminate
chiamando std::set_terminate
. L'implementazione predefinita di std::terminate
consiste nel chiamare l'interruzione.
A complicare le cose più, la maggior parte delle funzioni che vogliono fare alcuna garanzia circa la loro sicurezza rispetto alle eccezioni, soprattutto la garanzia di base o la garanzia forte, si basano sui tipi sottostanti a se stessi di non gettare nella loro dtor *
Il vero domanda è, in che stato sarebbe il tuo programma quando questo errore si verifica? Come puoi recuperare? Dove dovrebbe essere gestita questa ripresa? È necessario esaminare il caso specifico e risolvere questi problemi. A volte va bene catturare l'eccezione e ignorarla. Altre volte è necessario alzare alcune bandiere rosse.
Quindi la risposta è: è consentito dal C++ di generare un'eccezione in un dtor, ma non si dovrebbe mai permettere che scappi.
* Ecco una breve synopsis delle garanzie di eccezione (qui c'è un molto più lungo article)
- Recap: brevemente definire le garanzie Abrahams sicurezza rispetto alle eccezioni (di base, forti, e nothrow).
La garanzia di base è che fallito operazioni possono alterare stato di programma ma si verificano perdite e colpiti oggetti/moduli sono ancora distruttibili ed utilizzabile, in uno stato coerente (ma non necessariamente prevedibile).
La garanzia forte comporta transazionale commit/rollback semantica: falliti operazioni garantiscano stato programma è invariato rispetto agli oggetti operati. Ciò significa che nessun effetto collaterale influisce sugli oggetti, compresa la validità o il contenuto di degli oggetti helper correlati come gli iteratori che puntano nei contenitori manipolati.
La garanzia di nothrow significa che le operazioni non riuscite non si verificano. L'operazione non genererà un'eccezione.
fonte
2009-07-27 18:06:40
Solo per chiarimenti, stai chiedendo se è ok se il distruttore cattura l'eccezione, quindi non lascia mai il distruttore, o se è ok lasciare che lasci il distruttore finché viene catturato fuori? – jalf
Sto chiedendo se è OK se l'eccezione rimane nel d'tor. –