Kann eine gefangene std :: exception jemals was () als NULL haben?
Ist die Überprüfung auf e.what () unterhalb des Overheads?
%Vor%Der Inhalt der Zeichenfolge ist in der Implementierung definiert, daher denke ich, dass die Antwort ja lautet.
Bearbeiten: Sichern Sie das. Der Standard sagt:
%Vor% Es muss also eine Zeichenfolge zurückgegeben werden, nicht nur ein Zeiger. Und eine Zeichenfolge kann nicht NULL
sein. Wie andere darauf hingewiesen haben, ist es einfach, Ausnahmen abzuleiten, deren what()
NULL
zurückgibt, aber ich bin mir nicht sicher, wie solche Dinge in die Standardkonformität passen. Sicherlich, wenn Sie was () in Ihrer eigenen Ausnahmeklasse implementieren, würde ich es als sehr schlechte Übung betrachten, es NULL zu erlauben.
Mehr:
Für eine weitere Frage, die darauf hinweist, ob what()
NULL zurückgeben kann, und ähnliche spannende Probleme finden Sie unter Erweiterung der C ++ - Standardbibliothek durch Vererbung?
Wenn jemand von std :: exception geerbt und überschrieben hat, was NULL zurückgeben soll, dann ist dies möglich.
%Vor%Trotz Neils ausgezeichnetem Fund im Standard, könnte es immer noch gut sein, nach NULL zu suchen. Obwohl die Spezifikationen, welche Child-Klassen des std :: exception state sie nicht NULL zurückgeben sollten, wird nichts in Ihrem Compiler dies erzwingen und der obige Code wird immer noch entsprechend der Sprache legal sein.
Dies kann eine ideale Situation sein, um eine Bestätigung zu verwenden ...
%Vor%oder
%Vor%weil dies ein Fall ist, in dem etwas niemals passieren sollte und Sie davon ausgehen, dass es nicht passieren sollte, aber trotzdem gerne wissen würde (im Debug-Modus), wenn sich Ihre Annahmen als falsch erweisen. Dann können Sie entweder Ihre falsche Annahme ansprechen oder den falschen Code adressieren, der Ihrer Annahme widersprechen könnte (stellen Sie sicher, dass what () NULL nicht zurückgibt).
Wie viele andere darauf hingewiesen haben, sollte what()
nicht einen Null-Zeiger zurückgeben, sondern könnte . Der Laufzeit-Overhead eines Null-Tests kommt nur in dem Ausnahmefall vor, in dem er vermutlich weniger wichtig ist.
In jedem Fall würde ich zumindest empfehlen, assert
zu verwenden.
Wenn auch der Coderaum eine Rolle spielt, sind die Tests, Codeüberprüfungen und andere QA hoffentlich vollständig genug, um vor dem Versand alle problematischen, nicht konformen Ausnahmen aufzuspüren.
Seien Sie auch vorsichtig mit Ausnahmebehandlungscode, der selbst werfen kann (zum Beispiel, wie andere bemerkt haben, Speicher mit assert
zuzuteilen, während eine std::string
-Ausnahme verarbeitet wird.)