terminate() und unexpected abfangen
-
nabened leute,
ich habe ein problem beim anfangen von terminate() und unexpected. ich hab hier mal den code auf das nötigste reduziert, aber immer nachdem der terminate/unexpected handler aufgerufen wurde, beendet sich das programm. hab ich irgendwo was vergessen oder nicht so richtig kapiert (also set_unexpected und set_terminate hab ich ja aufgerufen, aber seht selbst) ?
#include <iostream> #include <stdexcept> using namespace std; void func(int x) throw( const char*) { if(x<0) throw "Eingabe ist kleiner als 0!"; else if(x==0) cout<<"func() oderntlich aufgerufen!"<<endl; else if(x==1) throw bad_alloc(); else throw 1; }; void terminateHandler(void) { cout << "Programm hat ein tragisches Ende genommen ..."<< endl; }; void expHandler(void) { cout<<"Unexpected Handler aufgerufen."<<endl; }; int main() { set_unexpected(expHandler); set_terminate(terminateHandler); int i; cin.exceptions(ios::eofbit | ios::failbit); try { cout<<"Bitte Integerwert eingeben: "; /* i < 0 => Info, i==0 =>OK, i==1 => unexpected, terminate glaube ich i>0 =>unexpected... */ cin>>i; func(i); cout << "Keine Exception ausgeloest" << endl; } catch( const char* msg ) { cout << "Exception-Handler fuer const char* " << "wurde aufgerufen:"<<endl; cout<< msg << endl; } catch(ios::failure& e) { cout<<"Fehler bei Eingabe aufgetreten:"<<endl; cout<<e.what()<<endl; cout<<"Fehlerkennung: "<<cin.exceptions()<<endl; } catch(...) { cout<<"Fehler unbekannter Herkunft aufgetreten."<<endl; } system("pause"); return 0; };
Vielen Dank schonmal vorab
-
aber immer nachdem der terminate/unexpected handler aufgerufen wurde, beendet sich das programm. hab ich irgendwo was vergessen oder nicht so richtig kapiert
Letzteres scheinbar. Z.B. kann der unexpected-handler eine Exception nicht einfach essen und dann "normal" weitermachen. Er kann lediglich die Expcetion durch eine erlaubte Exception ersetzen und dann diese werfen (was nicht so leicht ist, da es nur einen globalen unexpected-handler gibt, aber beliebig viele verschiedene Funktionen mit beliebig unterschiedlichen Exception-Spezifikationen, die verletzt werden können) In diesem Fall läuft die Exception-Propagation dann normal weiter. Andernfalls wird terminate aufgerufen. Ein terminate-handler hingegen muss als letztes das Programm beenden. Sollte er das nicht tun (wie in deinem Fall), wird schlicht abort aufgerufen, was wiederum das Programm beendet.
-
Vielen Dank! Das mit dem unexpected hab ich soweit verstanden aber wie kann ich bei einem Aufruf von terminate() die Beendigung des Programms verhindern oder macht sowas grundsätzlich keinen Sinn?
-
Das sagte Hume ja gerade: es geht nicht (oder hab ich da was falsch verstanden) Wenn terminate aufgerufen wurde ist etwas grundlegend schiefgelaufen und die Aufgabe von terminate ist es, dein Programm dann zu beenden. Wenn du das nicht willst darf es eben nicht dazu kommen dass terminate aufgerufen wird. So habe ich Humes Post zumindest verstanden.
-
Ja, genau, erstens es geht nicht, und 2. es macht keinen Sinn.
Du fragst ja auch nicht "wie kann ich bei einem Frontalzusammenstoss verhindern dass mein Auto stehen bleibt", oder?
-
hustbaer schrieb:
Du fragst ja auch nicht "wie kann ich bei einem Frontalzusammenstoss verhindern dass mein Auto stehen bleibt", oder?
OK klingt einleuchtend