Ci sono alcuni articoli che concludono "mai un'eccezione da un distruttore", e "std :: uncaught_exception() non è utile", per esempio:diritti d'uso di std :: uncaught_exception in un distruttore
- http://www.gotw.ca/gotw/047.htm (scritto da Herb Sutter)
Ma a quanto pare non ho capito il punto. Così ho scritto un piccolo esempio di test (vedi sotto).
Dato che tutto va bene con l'esempio di test, apprezzerei molto i commenti su cosa potrebbe esserci di sbagliato in questo?
risultati della prova:
./main
Foo::~Foo(): caught exception - but have pending exception - ignoring int main(int, char**): caught exception: from int Foo::bar(int)
./main 1
Foo::~Foo(): caught exception - but *no* exception is pending - rethrowing int main(int, char**): caught exception: from Foo::~Foo()
esempio:
// file main.cpp
// build with e.g. "make main"
// tested successfully on Ubuntu-Karmic with g++ v4.4.1
#include <iostream>
class Foo {
public:
int bar(int i) {
if (0 == i)
throw(std::string("from ") + __PRETTY_FUNCTION__);
else
return i+1;
}
~Foo() {
bool exc_pending=std::uncaught_exception();
try {
bar(0);
} catch (const std::string &e) {
// ensure that no new exception has been created in the meantime
if (std::uncaught_exception()) exc_pending = true;
if (exc_pending) {
std::cerr << __PRETTY_FUNCTION__
<< ": caught exception - but have pending exception - ignoring"
<< std::endl;
} else {
std::cerr << __PRETTY_FUNCTION__
<< ": caught exception - but *no* exception is pending - rethrowing"
<< std::endl;
throw(std::string("from ") + __PRETTY_FUNCTION__);
}
}
}
};
int main(int argc, char** argv) {
try {
Foo f;
// will throw an exception in Foo::bar() if no arguments given. Otherwise
// an exception from Foo::~Foo() is thrown.
f.bar(argc-1);
} catch (const std::string &e) {
std::cerr << __PRETTY_FUNCTION__ << ": caught exception: " << e << std::endl;
}
return 0;
}
AGGIUNTI : In altre parole: nonostante gli avvertimenti in alcuni articoli funziona come previsto, quindi cosa potrebbe esserci di sbagliato?
Qual è la tua domanda? Sembra che tu stia osservando il comportamento previsto di un meccanismo che non dovresti usare. Stai pensando di usarlo al di fuori di un contesto di sperimentazione/sperimentazione e perché? – Potatoswatter
@Potatoswatter: la domanda è: 'nonostante gli avvertimenti in alcuni articoli funziona come previsto - quindi cosa potrebbe esserci di sbagliato?' –
Fair nug, ma questo non sta citando quello che hai detto, ed è impossibile sapere cosa ci si aspetta, appropriato, o sicuro nel tuo contesto senza ulteriori informazioni. La via sicura, come Herb Sutter e molti altri ti diranno, non è di buttare da un distruttore in primo luogo. – Potatoswatter