C++ bekommen, Beschreibung der exception gefangen in der catch (...) - block
kann ich die Beschreibung einer Ausnahme durch
catch(...)
block? so etwas wie .was() von std::exception.
- In C++11 erneute auslösen von
std::current_exception
kann verwendet werden, für die Anreisewhat
Mitteilung der Ausnahme im catch-all-block: stackoverflow.com/a/37222762/5447906
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einen trick, den Sie vielleicht in der Lage sein zu verwenden:
und so weiter, für so viele verschiedene Arten, wie man denken könnte, geworfen werden. Wenn Sie wirklich wissen nichts über das, was sein könnte geworfen, dann auch noch das zweite-to-Letzte ist falsch, denn jemand könnte dir ein
char*
, die nicht auf einen nul-terminierten string.Es ist generell eine schlechte Idee zu werfen, was nicht ein
std::exception
oder abgeleitete Klasse. Der Grundstd::exception
vorhanden ist, damit alle werfen und fangen von Objekten, die Sie tun können, etwas nützliches mit. In einem Spielzeug-Programm, wo Sie wollen einfach nur noch raus und kann auch nicht gestört werden, um ein standard-header, OK, vielleicht werfen einint
oder ein string-literal. Ich glaube nicht, dass ich würde machen, dass ein Teil der formal-Schnittstelle. Alle Ausnahmen, die Sie werfen, sind Teil des formalen-Schnittstelle, auch wenn Sie irgendwie vergessen zu dokumentieren.try
-block innerhalb einercatch(...){}
und erneute auslösen einer exception, um zu bestimmen, dessen Typ.)throw
mit keine Operanden (rethrows die aktuelle Ausnahme).Diesem block fangen könnte, ein int, oder ein const char*, oder so etwas. Wie kann der compiler wissen, wie man etwas beschreiben, wenn es nichts davon weiß? Wenn Sie wollen, um Informationen zu bekommen aus eine Ausnahme, Sie müssen wissen, die Art.
__what()
dass gibt einen string zurück, der typeinfo-name der aktuellen Ausnahme (einfach zu implementieren), gefolgt von mehr Zeichen beschreiben den Wert (in der Praxis könnte man leicht, sondern mühsam Abdeckung builtin-Typen, und die meisten der standard-Bibliothek, und vielleicht haben einige grundlegende Implementierungen für benutzerdefinierte Typen). Natürlich würde es bedeuten, der compiler-emitting einige bloaty-code für jeden Typ zu string-Konvertierung, aber dann denken Sie, wie vieleoperator<<
gibt es da schon. Tut es für alles natürlich nicht möglich.Wenn Sie wissen, dass Sie nur throw std::exception oder Unterklassen, versuchen
Anders, als DeadMG schrieb, seit Sie werfen kann (fast) alles, können Sie nicht davon ausgehen, alles, was man erwischt.
Normalerweise catch(...) sollte nur verwendet werden, als der Letzte Schutz, wenn über Sie schlecht geschrieben oder dokumentiert externen Bibliotheken. So verwenden Sie eine Hierarchie
Seit C++11 können Sie erfassen die aktuelle exception mit einem Zeiger:
Dieser verhält sich wie ein smart pointer; so lange es noch mindestens einen Zeiger auf den exception-Objekt wird Sie nicht zerstört.
Später (vielleicht sogar in einer anderen Funktion) Sie können Maßnahmen ergreifen, ähnlich wie die aktuellen top-Antwort:
Wie wir haben unsere Ausnahmen umgesetzt wird, haben wir unsere eigene Exception-Klassen, die sind alle aus
std::exception
..Ausnahmen enthält Exception, Funktion name, Dateiname und Zeile wo exceptions generiert werden. Diese sind alle nützlich, nicht nur zu zeigen, dass Sie die Nachrichten, sondern kann auch verwendet werden, für Protokollierung, die hilft, zu diagnostizieren, die Ausnahme, ganz einfach. Wir bekommen also die gesamte information über die Ausnahmen generiert.
Erinnern Ausnahmen sind für uns, um Informationen zu bekommen über das, was schief gelaufen ist. Also, jedes bit der Informationen, hilft in dieser Hinsicht..
Zitieren bobah
std::exception_ptr
ist ein smart shared pointer auf eine nicht spezifiziert geben, so gibt es keine Garantie, dass__cxa_exception_type()
vorhanden ist