Ich stieß auf einen Code wie diesen:
%Vor% Ich habe ein wenig gegoogelt und ein paar andere Code-Snippets gefunden, die dieses seltsam aussehende throw 0
-Form verwenden.
Ich nehme an, man würde dies als:
verstehen %Vor% Oder ist das ein NULL ptr? gefangen werden als void*
?
Was macht throw 0
? Ist es in irgendeiner Weise besonders?
Meine normale Vorliebe wäre, etwas zu werfen, das std::exception
ist (oder davon abgeleitet ist). Für mich sieht das also "schlecht" aus.
Ist es "schlecht"?
Im Allgemeinen kann throw jeden beliebigen Typ werfen, den Sie benötigen, um ihn mit diesem Typ oder seinem Basistyp zu fangen.
Technisch gesehen ist es also legaler Code, aber ...
Es ist schlechter Code: Sie sollten Ihre Ausnahmen immer von std::exception
oder zumindest von einer Klasse ableiten, die einige nützliche Informationen über den Fehler und nicht über die reine Zahl liefert. Aber das Ableiten von std::exception
ist der korrekte Weg, weil es erlaubt, den obersten catch(std::exception const &e)
zu verwenden und mindestens einige Informationen über den Fehler zu erhalten.
Es ist nicht besonders, Sie können Int nur als eine Ausnahmeklasse angeben.
Es wird als ein schlechter Stil betrachtet, weil eine Ausnahmeklasse mehr darüber erzählen kann, was tatsächlich passiert ist.
Es ist ein Int. Es ist "schlecht", da das Auslösen von 0 den Code unlesbar macht oder darauf hinweist, dass jemand Ausnahmen als wertverursachendes System verwendet. (Es ist im Grunde das gleiche Problem wie eine magische Zahl innerhalb des Codes)
NULL ist definiert als ((void *)0)
. Wenn der Compiler eine 0 sieht, bedeutet das einen int. Es kann automatisch auf etwas anderes übertragen werden, aber nur, wenn es einen Grund gibt (z. B. Zuweisung zu verdoppeln). Die Zeile throw 0
gibt keinen solchen Grund, also wird ein int geworfen.