Deklaration der von einer Funktion geworfenen Ausnahmen

Man kann (muß aber nicht) hinter der Parameterliste einer Funktionsdeklaration angeben, ob und wenn ja welche Ausnahmen von dieser Funktion geworfen werden:
void up( int i, int j ) throw( int, CFahrzeug );
Hier wird zugesichert, daß up() nur Ausnahmen vom Typ int oder CFahrzeug (oder davon abgeleiteten Klassen) wirft.

Dagegen garantiert die Deklaration:
void up2( int i, int j ) throw();
daß die Funktion überhaupt keine Ausnahme wirft.

Der Compiler kann dies zur Übersetzungszeit gar nicht oder zumindest nicht in jedem Fall kontrollieren, weil er nicht alle direkt oder indirekt aufgerufenen Unterprogramme kennt, also auch nicht kontrollieren kann, was darin alles geworfen werden könnte.

Wird eine Funktion an mehreren Stellen deklariert, dann müssen überall die selben Ausnahmen gelistet werden.

Macht man gar keine Angaben über die geworfenen Ausnahmen:
void up3( int i, int j );
dann darf die Funktion werfen, was sie will.

Will man eine virtuelle Elementfunktion überschreiben, dann darf die Überschreibung die Liste der geworfenen Ausnahmen einengen, aber nicht erweitern.

Wenn für Funktion eine Liste der möglichen Ausnahmen spezifiziert ist, sie aber trotzdem etwas anderes zu werfen versucht, dann wird zur Laufzeit die Funktion std::unexpected() aufgerufen, die normalerweise std::terminate() aufruft, die wiederum im Standardfall mit abort() das laufende Programm beendet.

Man hat mehrere Möglichkeiten, dieses Verhalten zu ändern:

AnyWare@Wachtler.de