Frage zur Blocküberwachung
-
Hallo Leute!
Ich habe mal ein Frägelchen zur Blocküberwachung.Folgender Fall:
Ich habe eine Funktion, die eine Exception auslöst, deren Typ ich nicht wirklich kenne.
Darum verwende ich catch(...) um sie auch wirklich abzufangen.Problem:
Wie komme ich an den ge"throw"ten Wert?Snippet:
... try { foo(); //wirft mit Exceptions um sich } catch(...) { //Hier will ich irgendwie doch noch an die Exception ran } ...Geht das überhaupt oder muss ich das ganz anders machen?
Danke im Voraus!
-
Wenn Deine Exceptions die gleiche Basisklasse haben, dann kannst Du einfach Basisklasse fangen.
z.B. wenn alle von std::exception abgeleitet sind
try { // irgendwas } catch(std::exception& e) { // Egal welche Deiner Exceptions } catch(...) { // hier kommst Du AFAIK nicht an die Exception ran }
-
-
Airdamn schrieb:
Wenn Deine Exceptions die gleiche Basisklasse haben, dann kannst Du einfach Basisklasse fangen.
z.B. wenn alle von std::exception abgeleitet sind
Und wenn das eben mal nicht zutrifft? Wenn ich beispielsweise eine fremde API verwende, in der der Programmierer eine eigene (für mich unbekannte) Exception-Klasse entworfen hat?
Ich würde hier eigentlich versuchen soviele Daten wie möglich zu sammeln.
Zum Beispiel den Typ des ge"throw"ten Wertes ausgeben (RTTI).Aber letztendlich wird dieser Fall sowieso nicht auftreten.
-
Blaze schrieb:
Und wenn das eben mal nicht zutrifft? Wenn ich beispielsweise eine fremde API verwende, in der der Programmierer eine eigene (für mich unbekannte) Exception-Klasse entworfen hat?
Dann kannst du die spezielle exception auch nicht fangen und somit nichts genaues über sie rausbekommen. Also lies die Doku zu dieser API und schau ob du den Typ der Exception findest. Wenn nicht, lass die Finger von dieser API.
-
catch(...)ist eigentlich auch nicht nötig, wenn man weiss, welche Exceptiontypen geworfen werden können. Es eignet sich jedoch hervorragend zum Ignorieren von Exceptions...
-
[quote="Blaze"]
Airdamn schrieb:
Wenn ich beispielsweise eine fremde API verwende, in der der Programmierer eine eigene (für mich unbekannte) Exception-Klasse entworfen hat?
Wenn er nicht dokumentiert was er wirft solltest du ihm eine bitterböse Mail schicken oder es einfach gleich sein lassen. Zu dokumentieren wo welche Exceptions fliegen können ist das mindeste was er bei seiner API an Dokumentation mitliefern sollte. Tut er das nicht, lass wie oben schon gesagt wurde die Finger davon, dann ist es vermutlich sicherer und mit weniger Ärger und Risiko verbunden wenn du dir die Funktionalität gleich selber programmierst.