2009-03-04 8 views
11

Was ist der Vorteil, die möglichen Ausnahme-throws von einer C++ - Funktion zu deklarieren? Mit anderen Worten, was macht das Hinzufügen des Schlüsselwortes throw() eigentlich?Welchen Vorteil hat das Einschränken von Würfen, die von einer C++ - Funktion zugelassen werden?

Ich habe gelesen, dass eine Funktionsdeklaration wie void do_something() throw(); garantieren sollte, dass keine Ausnahmen von der do_something()-Funktion stammen; Dies scheint jedoch nicht für Funktionen zu gelten, die innerhalb von do_something() aufgerufen werden, was es zu einer schwachen Garantie macht.

Bitte beschreiben Sie die Nützlichkeit (und die besten Anwendungsfälle) dieser Sprachfunktion.

Antwort

0

Grundsätzlich durch die Funktion mit throw(); erklären Sie sagen, den Compiler, dass Sie hundertprozentig sicher sind, dass die Funktion nicht ist geht alle Ausnahmen zu werfen, so dass der Compiler einige Optimierungen durchzuführen. Wenn Ihre Funktion trotzdem eine Ausnahme auslöst, befinden Sie sich in Schwierigkeiten, da dies höchstwahrscheinlich zu undefiniertem Verhalten führt.

+2

Well- ist definiertes Verhalten, eigentlich: es ruft unerwartete(). Schlecht implementiertes Verhalten, ja, aber klar definiert. – MSalters

5

Der C++ - Standard erfordert, dass die Funktion unexpected() aufgerufen wird, wenn eine Funktion versucht, eine Ausnahme auszulösen, die nicht in der Ausnahmeliste enthalten ist. Eine kurze Beschreibung dieser von MSDN ist hier: http://msdn.microsoft.com/en-us/library/awbt5tew(VS.80).aspx

Die meisten Compiler eigentlich nicht diese C++ Funktion unterstützen.

+1

>> Die meisten Compiler unterstützen diese C++ - Funktion nicht << - und für ein Beispiel siehe die MSVC-Dokumentationsseite, auf die Sie verwiesen haben ... –

1

Dies ist eine Garantie seitens der Implementiererseite, dass die Funktion niemals eine Ausnahme auslöst. Das kann ein Client der Funktion erwarten. Es bedeutet jedoch auch, dass jede Ausnahme, die irgendwo innerhalb der Funktion erzeugt wird, behandelt wird und nicht zum übergeordneten Element do_something() zurückgeworfen wird. Schande über den, der von innen zurückkommt, denn nichts wird ihn davon abhalten zu werfen. Dies liegt daran, dass das Werfen aus einer Funktion mit einer leeren Ausnahmebedingung gleichbedeutend damit ist, eine Ausnahme zu werfen, die in der Spezifikation nicht erwähnt ist, und zu veranlassen, dass die std::unexpected() gefolgt von einer Programmbeendigung erwartet wird.

BTW: Die allgemein akzeptierte Definition der starken Ausnahmegarantie lautet: Wenn eine öffentliche Operation aus irgendeinem Grund fehlschlägt, wird eine Ausnahme ausgelöst, und der Status des Objekts bleibt unverändert (atomare Operation).

Verwandte Themen