Freigeben über


Ausnahmen: Funktionen zum Auslösen und Wiederverwenden

  • Die raise Funktion wird verwendet, um anzugeben, dass ein Fehler oder eine außergewöhnliche Bedingung aufgetreten ist. Informationen zum Fehler werden in einem Ausnahmeobjekt erfasst.
  • Die reraise Funktion wird verwendet, um eine behandelte Ausnahme in der Aufrufkette zu verteilen.

Syntax

raise (expression)

Bemerkungen

Die raise Funktion generiert ein Ausnahmeobjekt und initiiert einen Stapel-Abspannvorgang. Der Stapel-Abbruchprozess wird von der Common Language Runtime (CLR) verwaltet, sodass das Verhalten dieses Prozesses identisch ist wie in jeder anderen .NET-Sprache. Der Stapelentspannvorgang ist eine Suche nach einem Ausnahmehandler, der der generierten Ausnahme entspricht. Die Suche beginnt im aktuellen try...with Ausdruck, falls vorhanden. Jedes Muster im with Block wird in der Reihenfolge überprüft. Wenn ein übereinstimmenden Ausnahmehandler gefunden wird, wird die Ausnahme als behandelt betrachtet. andernfalls wird der Stapel entwundt und with blockiert die Aufrufkette, bis ein übereinstimmender Handler gefunden wird. Alle finally Blöcke, die in der Anrufkette auftreten, werden ebenfalls sequenziert ausgeführt, wenn sich der Stapel abwickelt.

Die raise Funktion entspricht throw in C# oder C++.

Die folgenden Codebeispiele veranschaulichen die Verwendung der raise Funktion zum Generieren einer Ausnahme.

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 zum Auslösen von .NET-Ausnahmen verwendet werden, wie im folgenden Beispiel gezeigt.

let divide x y =
  if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
  else
     x / y

Erneutes Erstellen einer Ausnahme

Die reraise Funktion kann in einem with Block verwendet werden, um eine behandelte Ausnahme in der Aufrufkette zu verteilen. reraise keine Ausnahmeopernden. Es ist am nützlichsten, wenn eine Methode ein Argument von einem Aufrufer an eine andere Bibliotheksmethode übergibt, und die Bibliotheksmethode löst eine Ausnahme aus, die an den Aufrufer übergeben werden muss.

Die reraise Funktion kann nicht für den with Konstruktblock trywith/in berechneten Listen, Arrays, Sequenzen oder Berechnungsausdrücken verwendet werden, einschließlich task { .. } oder .async { .. }

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