Come assicurarsi che il distruttore non possa lanciare un'eccezione?

2

So che possiamo specificare il compilatore che una funzione non stia generando un'eccezione usando l'identificatore noexcept, ma le funzioni noxecept possono ancora generare eccezioni. Quindi, come impedire al distruttore di generare un'eccezione?

    
posta Ayush Chaurasia 27.02.2015 - 04:59
fonte

2 risposte

4

Se una funzione è dichiarata come nothrow lancia comunque un'eccezione, questo è un bug puro e semplice.

Dato che, per garantire che i tuoi distruttori non generino eccezioni, esistono due percorsi:

  1. Richiama solo le funzioni note per non generare un'eccezione (perché sono dichiarate con nothrow , sono documentate che non vengono lanciate o implementate in una lingua senza eccezioni)
  2. Avvolgi le chiamate nel tuo distruttore che potrebbero generare un blocco try { } catch(...) .
risposta data 27.02.2015 - 10:07
fonte
2

Contrassegnalo noexcept .
In C ++ 11 e seguenti, il distruttore viene automaticamente dichiarato noexcept , a meno che almeno un distruttore (su base o membro) del subobject possa essere lanciato, oppure si fornisca esplicitamente una specifica diversa eccezione.

E se la tua funzione è contrassegnata come non-lancio, non getterà mai, qualunque cosa tu provi.

Invece:

  1. Se la specifica delle eccezioni è dinamica ( throw() ), chiama std::unexpected() .
  2. Se la specifica delle eccezioni non è dinamica o std::unexpected() , chiama std::terminate() per interrompere il programma.
risposta data 08.01.2016 - 21:50
fonte

Leggi altre domande sui tag