Frage

Ich lese diese Seite http://www.cplusplus.com/doc/tutorial /exceptions.html es sagt, wenn i-Funktion () throw schreiben (); keine Ausnahmen können in dieser Funktion geworfen werden. Ich habe versucht, in msvc 2005 schriftlich throw (), werfen (int), werfen () und überhaupt nichts. jeder hatte exakt die gleichen Ergebnisse. Nichts. Ich warf int, char *, eine andere Art und es war alles auf die gleiche Weise gefangen. Es sieht aus wie throw doesnt es überhaupt beeinflussen. Was bedeutet function () throw () eigentlich?

War es hilfreich?

Lösung

Siehe dieser Artikel Details zu C ++ Ausnahme Spezifikationen und Microsofts Implementierung:

  

Microsoft Visual C ++ 7.1 ignoriert Ausnahme Spezifikationen, wenn sie leer sind. Leere Ausnahme Spezifikationen entsprechen __declspec(nothrow), und sie können den Compiler helfen Codegröße zu reduzieren.

     

[...] Wenn es eine leere Ausnahme-Spezifikation sieht, wird es vorausgesetzt, dass Sie wissen, was Sie tun und optimiert die Mechanik weg für Ausnahmen zu tun. Wenn Ihre Funktion wirft ohnehin - na ja, Schande über Sie. Verwenden Sie diese Funktion nur, wenn Sie 100% positiv sind Ihre Funktion nicht wirft und wird es nie.

Andere Tipps

Was Sie finden, ist, dass diese Version von VC ++ nicht Spezifikation Ausnahmen erzwingen. Ich glaube, dass wurde als Abweichung von der Norm dokumentiert.

Allerdings sind Ausnahme-Spezifikationen in der Regel keine gute Idee. Wenn ein Programm sie in einem standardkonformen Implementierung verletzt (das ist die VC ++ von VS 2005 nicht in diesem Fall war), wird das System soll es fangen. Dies bedeutet, dass die Spezifikation keinen Compiler-Optimierung Hinweis ist, sondern zwingt den Compiler, um zusätzliche Längen zu gehen, und manchmal suboptimal Code erzeugen.

Siehe die Boost-Begründung für die Gründe, warum die hoch angesehener-Boost Projekt nicht Ausnahme Spezifikationen. Dies ist Boost, was zu tun seltsame und nützliche Dinge mit erweiterten Teilen der Sprache etwas von dem Aushängeschild ist.

ein pragmatischer Blick auf Ausnahme Spezifikationen Zitiert :

  

(Mis) Verständnisse

     

Das zweite Problem zu tun hat, mit   zu wissen, was Sie bekommen. So viele   bemerkenswerte Personen, die Autoren einschließlich   der Boost-Exception-Spezifikation   Gründe haben es ausdrückte,   Programmierer neigen Ausnahme zu verwenden   Spezifikationen, als ob sie verhielten   die Art, wie der Programmierer möchte,   statt der Art, wie sie tatsächlich tun   verhalten.

     

Hier ist, was viele Leute denken, dass   Ausnahme Spezifikationen tun:

     
      
  • Garantie, dass Funktionen nur aufgelistet Ausnahmen auslösen (evtl.   keine).

  •   
  • Aktivieren Compiler-Optimierungen basierend auf dem Wissen, dass nur aufgelistet   Ausnahmen (möglicherweise keine) wird   geworfen.

  •   
     

Die über den Erwartungen liegen, wieder,   täuschend nah korrekt zu sein.

Siehe den Link für die vollständigen Details.

eine Ausnahme zu werfen ist nicht genug, müssen Sie einen try {} catch() Block Ausnahmen zu fangen. Wenn Sie keine Ausnahmen fangen, wird std::terminate() genannt und das Programm beendet abrupt. Nehmen Sie sich Zeit und haben gehen unter dieser .

throw Spezifikationen sind für zwei Zwecke:

  1. als Vertrag zwischen Schnittstelle dienen implementiert und Benutzeroberfläche - Sie angeben, welche Ausnahmen von Ihrer Methode throwned werden kann, betrachten manche Menschen ist es Teil einer Schnittstelle. (Vertrag) Ala geprüfte Ausnahmen in Java.

  2. Als ein Weg, den Compiler zu signalisieren, dass es bestimmte Optimierungen für den Fall gelten kann, kann keine Ausnahme von einer Methode / Verfahren (Einrichtung Ausnahmebehandlung Kosten etwas)

  3. geworfen werden

eine Ausnahme Werfen nicht in throw () angegeben Klausel ist ein Fehler, aber zu keinem Zeitpunkt ist die Implementierung um es zu überprüfen erforderlich für Sie. In der Tat ist es nicht einmal möglich, zu überprüfen, da es alle möglichen Ausnahmen von Subroutinen enthält Ihre Unterprogramm aufruft. (Möglicherweise von anderen Modulen) Es ist nicht einmal möglich, in einem einzigen Modul, wie leicht zu einem Halteproblem reduziert:)

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