If anything can go wrong, it will.— Murphy's Law
Eine Ausnahme (engl. exception) ist eine Situation, in der das Programm nicht wie erwartet fortgesetzt werden kann. Gleichzeitig besteht kaum eine Chance, geeigneter auf diese Situation zu reagieren als eine Ausnahme zu werfen, mit der der normale Programmlauf unterbrochen wird. Die geworfene Ausnahme ist ein Objekt beliebigen Typs, das Informationen über die Art der Ausnahmesituation enthalten kann. Das Programm kann an anderer Stelle die Ausnahmen fangen und durch geeignete Anweisungen die Situation zu retten suchen. Wird eine geworfene Ausnahme nicht gefangen, führt sie zum (abnormalen) Programmende.
Siehe auch: Schlüsselwörter try, throw, catch, <exception>, <stdexcept>, <cassert>, Beispiel Ausnahmebehandlung.
Syntax:
throw
Objekt;
Syntax:
try
{
// unsicherer Code, der Ausnahme werfen kann
}
catch(
Typ name)
{
// Ausnahmebehandlung
}
// weitere catch-Blöcke
Wenn im try
-Block eine Ausnahme geworfen wird,
werden alle im Block definierten Variablen abgebaut (stack unwinding).
Stimmt der Typ der geworfenen Ausnahme mit dem Typ einer catch
-Bedingung überein,
wird dieser catch
-Block abgearbeitet, der Ausnahmezustand gilt als beseitigt
und das Programm wird nach dem letzten catch
-Block fortgesetzt.
Der Block catch(…){
… }
fängt jeden Ausnahmetyp.
Im catch
-Block kann die gefangene Ausnahme mit der Anweisung throw;
weitergeworfen werden.
Funktionen können sich im Funktionskopf verpflichten, keine Ausnahmen zu werfen.
Syntax:
Typ Funktionsname(
Parameterliste) noexcept;
Versucht eine undisziplinierte Funktion dennoch Ausnahmen zu werfen,
wird das Programm über die Funktion std::unexpected()
beendet.
Die in C++98 erlaubten throw-Deklarationen haben sich nicht bewährt und sind in C++17 nicht mehr erlaubt.