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?
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?
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:
nothrow
, sono documentate che non vengono lanciate o implementate in una lingua senza eccezioni) try { } catch(...)
. 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:
throw()
), chiama std::unexpected()
. std::unexpected()
, chiama std::terminate()
per interrompere il programma. Leggi altre domande sui tag c++ exception-handling