catch-and-apply

Die Ausnahmebehandlung basiert auf den beiden Funktionen catch-and-apply (bzw. catch) und throw. Ausnahmen werden explizit mit throw oder implizit von den Grundfunktionen ausgelöst und können mit catch-and-apply und catch aufgefangen und behandelt werden.

Dabei muss beachtet werden, dass catch-and-apply und catch nur Ausnahmen auffangen können, die zur Laufzeit eines Programms ausgelöst werden. Ausnahmen, die während der Expansion eines Macros (siehe Macro) ausgelöst werden, können früher, zur Compilezeit eines Programms auftreten. Wann ein Macro expandiert wird, ist nicht festgelegt.

Die Funktion catch-and-apply erwartet drei Argumente und wertet diese aus. Beim ersten Argument handelt es sich um ein Symbol, dass zur Unterscheidung der Ausnahmen dient. Das zweite Argument ist eine Funktion mit zwei Parametern. Sie wird auf das Symbol und den Wert angewendet, die mit throw geworfen werden.

Das dritte Argument wird mit der Ausnahmebehandlung ausgeführt: Beim Catch-Ausdruck

(catch-and-apply name funct expr)

wird expr ausgewertet. Wenn keine Ausnahme auftritt, dann ist der Wert von expr der Wert des gesamten Ausdrucks. Wenn innerhalb von expr ein Teilterm der Form

(throw name value)

ausgeführt wird, wird die Auswertung von expr abgebrochen.

Der Wert des Catch-Ausdrucks ist in diesem Fall der Wert des Ausdrucks (funct name value), vorausgesetzt die Symbole in catch-and-apply und throw sind die gleichen oder es wurde nil als erstes Argument übergeben. In diesem Fall fängt catch-and-apply alle Ausnahmen auf, ungeachtet des bei throw übergebenen Symbols.

Ausnahmen innerhalb von Grundfunktionen, wie z.B. eine Division durch Null, werden mit dem Symbol error ausgelöst.

> (catch (quote exception) (+ 9 8))
17

> (catch-and-apply (quote exception) (lambda (name value) value) (+ (throw (quote exception) "hallo welt") 8 7))
"hallo welt"