Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.06.2009, 23:35

void f() throw();

Benutzt irgendwer von euch das throw hinter der Funktionsdeklaration? Ich habe heute mal festgestellt, dass es so etwas gibt, aber den Sinn verstehe ich noch nicht so ganz.
Nach ein bisschen herumexperimentieren sieht es so aus, als ob man bloß eine Warnung bekommt, wenn man direkt in der Funktion eine Exception wirft, die nicht auf diesen Typ passt. Wenn allerdings eine aufgerufenen Funktion eine Exception wirft, kriegt man nichtmal eine Warnung.

Also zur Fehlervermeidung scheint mir das sehr wenig zu bringen. Und auch Optimierungen kann ich mir kaum vorstellen, da die Funktion ja eine Exception schmeißen kann, egal ob da jetzt ein throw hinter steht oder nicht.

Das es guter Stil ist, oft const zu benutzen, leuchtet ja schnell ein, aber ich Frage mich, wieso man throw benutzen sollte. Nur um zu zeigen, dass die Funktion etwas wirft? Das ginge ja fast genausogut per Kommentar dahinter.

Also, gibt es noch einen anderen Nutzen, oder ist throw einfach nur eine standardisierte Art, dem Programmierer mitzuteilen, was diese FUnktion macht und bringt sonst nix?
Lieber dumm fragen, als dumm bleiben!

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

2

01.07.2009, 09:30

Das throw() verbietet der Funktion das werfen anderer Exceptions ausser den angegebenen.

Sollte daher eher nicht verwendet werden.

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

3

01.07.2009, 09:36

Das soll zum beispiel beim entwerfen von Funktionen benutzt werden,
da das nen bisl blöd kommt, wenn ne Exception ne Exception wirft ;)

4

01.07.2009, 10:11

Zitat von »"Beneroth"«

Das throw() verbietet der Funktion das werfen anderer Exceptions ausser den angegebenen.

Sollte daher eher nicht verwendet werden.

Wenn das so wäre, heiße das ja wenigstens, dass man alle Exceptions fangen müsste, dann wäre es ja imo eine Hilfe beim programmieren, das man keine potentielle Exception überseiht. Aber ich habe das gestern mit VC05 getestet und es gibt nur ne Warnung wenn die Exception direkt geworfen wird (kein Fehler) und überhaupt nix, wenn die Exception indirekt geworfen wird.
Vielleicht verhält sich VC da ja auch schlecht, aber verbieten tut ein throw scheinbar wenig bis gar nix.
Lieber dumm fragen, als dumm bleiben!

5

01.07.2009, 11:32

Mit std::set_unexpected() kann man eine Funktion festlegen, die im Falle falsch geworfener Exceptions aufgerufen werden soll. Soviel ich weiss, unterstützt der MSVC++ das Feature aber nicht.

Die Exception-Spezifikation macht in C++ sowieso nicht allzu viel Sinn, da die Exceptions erst zur Laufzeit geprüft werden. Wie soll man vernünftig auf eine unerwartete Exception reagieren? Das ist ein Logikfehler im Programm und sollte vorher behoben werden. Die throw()-Spezifikationen sieht man auch eher selten, ich bevorzuge selber Kommentare.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

01.07.2009, 14:46

Ja das is eine exception specification. MSVC unterstützt atm nur leere exception specifications.

Die Idee von exception Specifications mag ganz nett sein, aber ich find sie praktisch eigentlich überall ziemlich sinnlos. Wenn dann würd ich damit sparsam umgehen das es sich dabei um einen Laufzeitmechanismus mit entsprechendem overhead handelt (auch wenn man auf den ersten Blick etwas andres vermuten möchte, der Compiler darf hier nichtmal eingreifen wenn es offensichtlich ist dass die Specification verletzt wird, er darf maximal warnen).

Werbeanzeige