main fkt + unbehandelte exceptions
-
hmm.. hi ^^
ich habe zur zeit ein problem:
ich möchte ein programm schreiben (was ja so weit noch nicht all zu verwunderlich ist ^^), was folgendermaßen aufgebaut ist:int main() { try { return start(); //hier das eigentliche programm, was aber nur die exceptions auffängt, die es auch zuordnen kann und mehr oder minder darauf reagieren kann } catch (...) { #if _DEBUG throw; //beim testen würde ich natürlich sehr gerne sehen, was jetzt das problem war #else return EXIT_FAILURE; //allerdings sollte in nem richtigen build einfach nur das programm beendet werden... #endif } }da main() aber keine exception nach außen werfen darf, bringt mir mein compiler hier eine warnung...
nehm ich damit in kauf, dass ich undefiniertes verhalten beim debug-build erhalte oder will mich der compiler nur darauf aufmerksam machen, dass es idR keinen Sinn macht, eine Exception zu werfen, auf die nicht mehr reagiert werden kann?
falls man das ganze anders macht, würde mich das auch sehr interessieren - ich habe es auch schon mal mit 2 versch. main-fkt gesehen (eine für release und eine für debug) - aber diese lösung fand ich ein wenig seltsam, umständlich und unübersichtlich auch noch...
Und: Kann ich irgendwie nen catch basteln, was alles abfängt, wo ich aber noch mit typeid auf die exception an sich komme?
Also so was in der Richtung:template <class T> void myCatch(const T& val) { std::cout << typeid(T) << val.what() << std::endl; } int main() { try { return start(); } catch (...) { myCatch(?); } }Danke schon mal
bb, Tom
-
Darf ich fragen, wofür du so ein Verhalten einbauen möchtest? Grundsätzlich sollte man Exceptions durchwerfen lassen und nicht ein EXIT_FAILURE oder ähnliches aufrufen. Das OS kann dann meistens einen nicht all zu schlechten Fehlerbericht erstellen, wozu du selber nicht mehr in der Lage bist. Mit einem EXIT_FAILURE wird das Programm aber ganz normal beenden und das OS wird sich nicht weiter darum kümmern.
Wieso dein Compiler eine Warnung ausgibt, weiss ich nicht. Es wäre aber noch interessant zu erfahren, WAS für eine Warnung er denn bringt.
Eine Exception nicht zu fangen, ist übrigens so oder so undefiniertes Verhalten. Es ist völlig dem Betriebsystem überlassen, wie es dabei reagieren soll. Dies ist aber ein gewolltest undefiniertes Verhalten
Grüssli
-
ich will den endanwender nicht irgendwelche doofen fehlermeldungen um die ohren hauen sondern lieber einfach das programm abstürzen (bzw beenden) lassen... (am Ende kann man dann ja noch immer ne Fehlermeldung einbauen).
Oder ist das der falsche Weg?
(wobei hier ja auch der zweite teil der frage noch ins spiel kommt: wie kann ich mir sicher sein, dass ich alle exceptions abgefangen hab, die theoretisch geworfen werden, ohne jede funktion bis in die letzte unter-fkt durchzugucken? falls ich das garantieren könnte, würde sich das ganze weitergewerfe am ende ja eh erübrigen)
Die Fehlermeldung an sich heißt (da WinMain nicht mit nem nothrow deklariert ist, verwundert es mich ein wenig - und ins winapi-forum wollt ich nicht, da es mir ja schon allg. um C++ ging - und nicht, wie sich das Problem dieses eine Mal umgehen lassen würde):
warning C4297: 'WinMain' : function assumed not to throw an exception but does 1> __declspec(nothrow) or throw() was specified on the functiondie Deklaration lautet übrigens wie folgt:
int WINAPI /* == __stdcall*/ WinMain ( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd );bb
-
unskilled schrieb:
Oder ist das der falsche Weg?
Meiner Meinung nach definitiv. Sogar ein fatal falscher. Wenn das Programm abschmiert, dann lass es abschmieren. Sonst kommt der User nicht mal drauf, dir einen Report zu senden.
Man kann probieren letzte Behandlungen durchzuführen, z.B. irgendwelche Dinge speichern, aber auf jedenfall die Exception durchwerfen lassen.unskilled schrieb:
(wobei hier ja auch der zweite teil der frage noch ins spiel kommt: wie kann ich mir sicher sein, dass ich alle exceptions abgefangen hab, die theoretisch geworfen werden, ohne jede funktion bis in die letzte unter-fkt durchzugucken? falls ich das garantieren könnte, würde sich das ganze weitergewerfe am ende ja eh erübrigen)
catch(...)fängt alle Exceptions, welche auf C++ Wegen geworfen wurden.Ich empfehle dir mal die Lektüre von unseren drei Artikeln im Magazin:
http://magazin.c-plusplus.net/artikel/Exception-Handling
http://magazin.c-plusplus.net/artikel/Modernes Exception-Handling Teil 1 - Die Grundlagen
http://magazin.c-plusplus.net/artikel/Modernes Exception-Handling Teil 2 - Hinter den KulissenVielleicht zuerst lesen, solltest du Modernes Exception-Handling Teil 1, ganz letzter Abschnitt. Dort geht es um unbehandelte Exceptions

Grüssli
-
Dravere schrieb:
catch(...)fängt alle Exceptions, welche auf C++ Wegen geworfen wurden.das hab ich ja auch gar nicht bestritten - jedoch kann ich dann ja nicht mehr auf die exception an sich zugreifen sondern weiß nur, dass sie gefangen wurde und nicht den selben typ hat, wie die exceptions, die ich davor versucht habe, abzufangen ^^ aber ist auch egal - es geht eben nicht...
aber ansonsten war dieser absatz genau das, was ich gesucht hatte - danke
