c ++ - Ausnahmen, kann what () NULL sein?

8

Kann eine gefangene std :: exception jemals was () als NULL haben?

Ist die Überprüfung auf e.what () unterhalb des Overheads?

%Vor%     
Net Citizen 24.06.2009, 13:46
quelle

4 Antworten

13

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?

    
anon 24.06.2009, 13:49
quelle
5

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).

    
Doug T. 24.06.2009 13:50
quelle
2

Natürlich kann es NULL sein:

%Vor%     
schnaader 24.06.2009 13:49
quelle
0

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.)

    
jwfearn 24.06.2009 16:21
quelle

Tags und Links