Sie den Programmierer angeben, welche Ausnahmen von dieser Funktion geworfen werden. Sie haben den Vorteil, dass Sie die Garantie haben, dass keine anderen Ausnahmen von dieser Funktion ausgelöst werden können. Es wird jedoch nicht zur Kompilierungszeit überprüft, ob die Funktion tatsächlich Ausnahmen auslöst, die nicht in dem throw-Spezifizierer angegeben sind. Stattdessen wird es zur Laufzeit überprüft. Und wenn es fehlschlägt, dann wird unexpected()
aufgerufen, die standardmäßig abort()
aufruft, die wiederum Ihr Programm standardmäßig beendet. Also, es sei denn, du willst wirklich, dass dein Programm stirbt, wenn du versagst und eine unerwartete Ausnahme ausgelöst wird, ist es wahrscheinlich eine schlechte Idee, sie zu benutzen.
Der einzige Ort, wo ich sie tatsächlich empfehlen würde, ist auf Destruktoren. Es ist wirklich schlecht, wenn ein Destruktor wirft. Sie sollten niemals werfen.Wenn Sie also throw()
für einen Destruktor verwenden, um anzuzeigen, dass keine Ausnahme ausgelöst werden kann, wissen Sie, dass Ihr Programm lieber stirbt, als im schlechten Zustand weiterzumachen, in dem es sich befindet, nachdem eine Ausnahme von einem Destruktor ausgelöst wurde.
Unabhängig davon, ob Sie jede Art von throw Spezifizierer verwenden, müssen Sie sicher sein, dass Sie es wirklich wollen Ihr Programm sterben, wenn verletzt wird. Also, allgemein gesprochen, ist es am besten, sie nicht zu benutzen.
Der endgültige Artikel auf Ausnahme Spezifikationen: http://www.gotw.ca/publications/mill22.htm „Moral # 1:. Außer möglicherweise eine leere, aber wenn ich: Nie eine Ausnahme Spezifikation Moral # 2 schreiben Du würdest mir sogar das meiden. " –
http://www.gotw.ca/publications/mill22.htm –
Nachricht aus der Zukunft: wenn jemand das heute liest, sollte man wissen, dass 'noexcept' Programmleistung verbessern kann (in C++ 11) –