Welche Exception wo fliegen darf läßt sich einschränken. Defaultmäßig darf jede Exception geworfen werden, aber Einschränkungen sind dennoch möglich.
void foo() throw(int)
{
throw 3; //erlaubt
throw "autsch"; //verboten
}Mittels throw(int) sagen wir, dass die Funktion nur Exceptions vom Typ int werfen darf. Bei throw(int, char, foo), dürfte die Funktion nur Exceptions entweder vom Typ int, char oder foo werfen.
Allerdings findet die Überprüfung erst zur Laufzeit statt. Das bedeutet, dass sich der Code zwar kompilieren lässt, aber einen Fehler produziert. Um genau zu sein produziert der Code natürlich keinen Fehler, denn durch das throw "autsch"; wird nicht ausgeführt. Nehmen wir deshalb mal an, es würde ausgeführt werden: Die Funktion foo() würde eine Exception vom Typ char* werfen wollen - das darf sie aber nicht. Als Resultat wird eine Exception vom Typ bad_exception geworfen. Dies führt standardmäßig zu einem Aufruf der Funktion terminate() - diese beendet das Programm.
Diese verhalten (terminate) kann man selber bestimmen. Die Funktion set_unexpected kann man eine Funktion festlegen, die aufgerufen werden soll, wenn so eine Situation eintritt. Die Signatur der Funktion muss void foo() sein. Wichtig ist, dass diese Funktion sich nicht beenden darf, sondern sie muss das Programm abbrechen. Wenn unsere Funktion dies nicht tut, wird automatisch terminate() aufgerufen (welches die Anwendung beendet).
Was die Funktion terminate() macht, kann man ebenfalls selber bestimmen -> set_terminate().
Um die Funktionen terminate(), set_unexpected(), etc zur verfügung zu haben, müssen wir die Headerdatei '<exception>' inkludieren.
Meistens verwendet man allerdings keine Exception Spezifikationen - es ist besser die Dokumentation des Codes dafür zu verwenden. Die einzige wichtige Spezifikation ist throw(). Diese garantiert nämlich, dass die Funktion keine Exception wirft.