Was ist der Vorteil durch eine C ++ Funktion Würfe erlaubt Begrenzung? [geschlossen]

StackOverflow https://stackoverflow.com/questions/609332

  •  03-07-2019
  •  | 
  •  

Frage

Was ist der Nutzen der mögliche deklarieren Ausnahme Würfe aus einer C ++ Funktion? Mit anderen Worten, was das Stichwort throw() wirkt sich das Hinzufügen tatsächlich tun?

Ich habe gelesen, dass eine Funktionsdeklaration wie void do_something() throw(); garantieren soll, dass keine Ausnahmen von der do_something() Funktion stammen; aber dies scheint nicht wahr von Funktionen innerhalb do_something() genannt zu halten, so dass es eine schwache Garantie zu machen.

Bitte erläutern die Nützlichkeit (und am besten Anwendungsfälle) dieser Sprache-Funktion.

War es hilfreich?

Lösung

Niemand erklärt dies besser als Sutter

http://www.ddj.com/architect/184401544

Die kurze Version ist

  1. Sie niemals eine Ausnahme-Spezifikation schreiben
  2. Mit Ausnahme möglicherweise einen leeren

Andere Tipps

Der C ++ Standard verlangt, dass die unexpected() Funktion, wenn eine Funktion aufgerufen wird versucht, eine Ausnahme zu werfen, die nicht auf seiner Ausnahmeliste ist. Eine kurze Beschreibung dieser von MSDN ist hier: http: // msdn.microsoft.com/en-us/library/awbt5tew(VS.80).aspx

Die meisten Compiler nicht tatsächlich diese C ++ unterstützen Funktion.

void do_something() throw(); 

Dies ist eine Garantie von der Seite des Implementierer, dass die Funktion wird nie eine Ausnahme werfen. Das ist, was ein Kunde von der Funktion können erwarten. Allerdings bedeutet es auch jede Ausnahme erzeugt irgendwo in der Funktion behandelt wird und nicht wieder in das übergeordnete do_something() erneut ausgelöst. Schämt er die wieder throw-eth von innen, denn es gibt nichts, was ihn zu werfen stoppen werde. Dies liegt daran, mit einer leeren Ausnahme-Spezifikation innerhalb einer Funktion zu werfen äquivalent ist eine Ausnahme in der Beschreibung nicht erwähnt zu werfen und machte die std::unexpected() erwartet von Programmabbruch gefolgt werden soll.

BTW: Die allgemein akzeptierte Definition von starken Ausnahme Garantie ist. Wenn ein öffentlicher Betrieb aus irgendeinem Grund fehlschlägt, wird eine Ausnahme ausgelöst, und den Zustand des Objekts bleibt unverändert (atomare Operation)

Im Grunde genommen durch die Funktion mit throw(); erklären Sie sagen, den Compiler, dass Sie hundertprozentig sicher , dass die Funktion nicht gehe alle Ausnahmen zu werfen, so dass die Compiler einige Optimierungen durchzuführen. Wenn Ihre Funktion ohnehin eine Ausnahme auslöst, sind Sie in Schwierigkeiten, da es höchstwahrscheinliche Ergebnisse in undefiniertem Verhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top