Ausnahmen: Funktionen „raise“ und „reraise“
- Die
raise
-Funktion wird verwendet, um anzugeben, dass ein Fehler oder eine Ausnahmebedingung aufgetreten ist. Informationen zum Fehler werden in einem Ausnahmeobjekt erfasst. - Die
reraise
-Funktion wird verwendet, um eine behandelte Ausnahme in der Aufrufkette nach oben weiterzugeben.
Syntax
raise (expression)
Bemerkungen
Die raise
-Funktion generiert ein Ausnahmeobjekt und initiiert einen Stapelentladungsprozess. Der Stapelentladungsprozess wird von der Common Language Runtime (CLR) verwaltet, sodass das Verhalten dieses Prozesses mit dem Verhalten in jeder anderen .NET-Programmiersprache identisch ist. Beim Stapelentladungsprozess wird nach einem Ausnahmehandler gesucht, der der generierten Ausnahme entspricht. Die Suche beginnt im aktuellen try...with
-Ausdruck, sofern vorhanden. Die einzelnen Muster im with
-Block werden der Reihen nach überprüft. Wird ein übereinstimmenden Ausnahmehandler gefunden, gilt die Ausnahme als behandelt. Andernfalls wird der Stapel entladen, und with
-Blöcke weiter oben in der Aufrufkette werden überprüft, bis ein übereinstimmender Handler gefunden wird. In der Aufrufkette ggf. enthaltene finally
-Blöcke werden ebenfalls der Reihe nach ausgeführt, wenn der Stapel entladen wird.
Die raise
-Funktion entspricht throw
aus C# oder C++.
Die folgenden Codebeispiele veranschaulichen das Generieren einer Ausnahme mithilfe der raise
-Funktion:
exception InnerError of string
exception OuterError of string
let function1 x y =
try
try
if x = y then raise (InnerError("inner"))
else raise (OuterError("outer"))
with
| InnerError(str) -> printfn "Error1 %s" str
finally
printfn "Always print this."
let function2 x y =
try
function1 x y
with
| OuterError(str) -> printfn "Error2 %s" str
function2 100 100
function2 100 10
Die raise
-Funktion kann auch verwendet werden, um .NET-Ausnahmen auszulösen, wie im folgenden Beispiel zu sehen:
let divide x y =
if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
else
x / y
Erneutes Auslösen einer Ausnahme
Die reraise
-Funktion kann in einem with
-Block verwendet werden, um eine behandelte Ausnahme in der Aufrufkette nach oben weiterzugeben.
reraise
verwendet keinen Operanden für die Ausnahme. Die Funktion ist besonders hilfreich, wenn eine Methode ein Argument in einer aufrufenden Funktion an eine andere Bibliotheksmethode übergibt und die Bibliotheksmethode eine Ausnahme auslöst, die an den Aufrufer übergeben werden muss.
Die reraise
-Funktion darf nicht im with
-Block von try
/with
-Konstrukten in berechneten Listen, Arrays, Sequenzen oder in Berechnungsausdrücken (einschließlich task { .. }
und async { .. }
) verwendet werden.
open System
let getFirstCharacter(value: string) =
try
value[0]
with :? IndexOutOfRangeException as e ->
reraise()
let s = getFirstCharacter("")
Console.WriteLine($"The first character is {s}")
// The example displays the following output:
// System.IndexOutOfRangeException: Index was outside the bounds of the array.
// at System.String.get_Chars(Int32 index)
// at getFirstCharacter(String value)
// at <StartupCode>.main@()