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@()

Siehe auch