2009-03-02 1 views
8

Ich lese diese Seite http://www.cplusplus.com/doc/tutorial/exceptions.html es sagt, wenn ich function() schreibe throw(); In dieser Funktion können keine Ausnahmen ausgelöst werden. Ich versuchte in msvc 2005 write throw(), throw (int), throw() und gar nichts. Jeder hatte genau die gleichen Ergebnisse. Nichts. Ich warf int, char *, einen anderen Typ und es wurde alles auf die gleiche Weise gefangen. Es sieht so aus, als würde Throw das überhaupt nicht beeinflussen. Was macht funktion() throw() eigentlich?über C++ - Ausnahmen. func() throw()

Antwort

10

Siehe this article Details zu C++ Ausnahme Spezifikationen und Implementierung von Microsoft:

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

[...] Wenn es eine leere Ausnahmespezifikation sieht, wird es davon ausgehen, dass Sie wissen, was Sie tun, und optimieren Sie die Mechanismen für den Umgang mit Ausnahmen. Wenn deine Funktion trotzdem wirft - na, Schande über dich. Verwenden Sie diese Funktion nur, wenn Sie zu 100% positiv sind, wenn Ihre Funktion nicht ausgelöst wird und dies auch nicht tun wird.

+0

Das ist sehr verschieden von dem, was der Standard sagt ... Ich denke, ein Grund mehr, sie nicht zu verwenden –

+0

Danke für die Bearbeitung, Shog;) –

0

Das Auslösen einer Ausnahme reicht nicht aus, Sie benötigen einen try {} catch() Block, um Ausnahmen abzufangen. Wenn Sie keine Ausnahmen abfangen, wird std::terminate() aufgerufen und Ihr Programm wird abrupt beendet. Nehmen Sie sich Zeit und gehen Sie unter this.

+4

Was ist nicht das, was er gefragt hat. –

0

Wurf Spezifikationen für zwei Zwecke bestimmt sind:

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

  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 ausgelöst wird (Einrichtung Ausnahmebehandlung Kosten etwas)

eine Ausnahme nicht angegeben Wurf in throw() -Klausel ist ein Fehler, aber an keinem Punkt ist die Implementierung erforderlich, um es zu überprüfen für Sie. In der Tat ist es nicht einmal möglich, dies zu überprüfen, da es alle möglichen Ausnahmen von Subroutinen enthält, die Ihr Unterprogramm aufruft. (möglicherweise von anderen Modulen) Es ist nicht einmal innerhalb eines einzelnen Moduls möglich, da es leicht zu einem Halteproblem reduziert wird :)

+0

Völlig inkorrekt für C++. Exception-Spezifikationen müssen zur Laufzeit überprüft werden und erlauben im Allgemeinen keine Optimierungen. –

+0

Das ist nicht mein Punkt. Sie müssen nicht in COMPILE-TIME überprüft werden. Sie ermöglichen auch die Optimierung im Falle von KEINE AUSNAHMEN (IMHO C++ Language FAQ erwähnt es). Deine Stimme ist also falsch. – EFraim

4

Was Sie finden, ist, dass diese Version von VC++ Spezifikationsausnahmen nicht durchsetzte. Ich glaube, das wurde als Abweichung vom Standard dokumentiert.

Ausnahmespezifikationen sind jedoch normalerweise keine gute Idee. Wenn ein Programm sie in einer standardkonformen Implementierung verletzt (was das VC++ von VS 2005 in diesem Fall nicht war), soll das System es abfangen. Dies bedeutet, dass die Spezifikation kein Compiler-Optimierungshinweis ist, sondern den Compiler dazu zwingt, zu zusätzlichen Längen zu gehen und manchmal suboptimalen Code zu produzieren.

Siehe the Boost rationale aus Gründen, warum das hoch angesehene Boost-Projekt keine Exception-Spezifikationen verwendet. Das ist Boost, das ist das Aushängeschild für seltsame und nützliche Dinge mit fortgeschrittenen Teilen der Sprache.

1

Zitiert aus A Pragmatic Look at Exception Specifications:

(Mis) Verständnisse

Die zweite Frage hat mit zu tun, zu wissen, was Sie bekommen. Wie viele bemerkenswerte Personen, darunter die Autoren der Boost-Exception-Spezifikation Gründe, haben sie gesagt, neigen Programmierer Ausnahme Spezifikationen zu verwenden, als ob sie die Art und Weise benommen möchte der Programmierer, statt, wie sie tatsächlich tun verhalten sich.

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

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

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

Die über den Erwartungen sind wieder täuschend nah an korrekt.

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