Freigeben über


Ausnahmen: Der try...with-Ausdruck (F#)

In diesem Thema wird der try...with-Ausdruck beschrieben, der in F# für die Ausnahmebehandlung verwendet wird.

try
 expression1
with
  | pattern1 -> expression2
  | pattern2 -> expression3
  ...

Hinweise

In F# werden mit dem try...with-Ausdruck Ausnahmen behandelt. Er ähnelt der try...catch-Anweisung in C#. In der vorherigen Syntax generiert der Code in expression1 möglicherweise eine Ausnahme. Der try...with-Ausdruck gibt einen Wert zurück. Wenn keine Ausnahme ausgelöst wird, gibt der gesamte Ausdruck den Wert von expression1 zurück. Wenn eine Ausnahme ausgelöst wird, werden die einzelnen pattern nacheinander mit der Ausnahme verglichen. Für das erste übereinstimmende Muster wird der entsprechende expression, der als Ausnahmehandler bezeichnet wird, für die Verzweigung ausgeführt, und der gesamte Ausdruck gibt den Wert des Ausdrucks im Ausnahmehandler zurück. Wenn kein Muster übereinstimmt, wird die Ausnahme in der Aufrufliste aufwärts weitergeleitet, bis ein übereinstimmender Handler gefunden wird. Die Typen der von den einzelnen Ausdrücken in den Ereignishandlern zurückgegebenen Werte müssen mit dem vom Ausdruck im try-Block zurückgegebenen Typ übereinstimmen.

Häufig bedeutet das Auftreten eines Fehlers auch, dass kein gültiger Wert vorhanden ist, der von den Ausdrücken in den einzelnen Ereignishandlern zurückgegeben werden kann. Als Typ des Ausdrucks wird häufig ein Optionstyp verwendet. Das folgende Codebeispiel veranschaulicht dieses Schema.

let divide1 x y =
   try
      Some (x / y)
   with
      | :? System.DivideByZeroException -> printfn "Division by zero!"; None

let result1 = divide1 100 0

Ausnahmen können .NET-Ausnahmen oder F#-Ausnahmen sein. Sie können F#-Ausnahmen mit dem exception-Schlüsselwort definieren.

Sie können den Ausnahmetyp und andere Bedingungen mithilfe einer Vielzahl von Mustern filtern. Die Optionen werden in der folgenden Tabelle zusammengefasst.

Muster

Beschreibungen

:? exception-type

Entspricht dem angegebenen .NET-Ausnahmetyp.

:? exception-type as identifier

Entspricht dem angegebenen .NET-Ausnahmetyp, weist jedoch der Ausnahme einen benannten Wert zu.

exception-name(arguments)

Entspricht einem F#-Ausnahmetyp und bindet die Argumente.

identifier

Entspricht einer beliebigen Ausnahme und bindet den Namen an das Ausnahmeobjekt. Entspricht :? System.Exception as identifier

identifier when condition

Entspricht einer beliebigen Ausnahme, wenn die Bedingung true ist.

Beispiele

In den folgenden Codebeispielen wird die Verwendung der verschiedenen Ausnahmehandlermuster veranschaulicht.

// This example shows the use of the as keyword to assign a name to a
// .NET exception.
let divide2 x y =
  try
    Some( x / y )
  with
    | :? System.DivideByZeroException as ex -> printfn "Exception! %s " (ex.Message); None

// This version shows the use of a condition to branch to multiple paths
// with the same exception.
let divide3 x y flag =
  try
     x / y
  with
     | ex when flag -> printfn "TRUE: %s" (ex.ToString()); 0
     | ex when not flag -> printfn "FALSE: %s" (ex.ToString()); 1

let result2 = divide3 100 0 true

// This version shows the use of F# exceptions.
exception Error1 of string
exception Error2 of string * int

let function1 x y =
   try
      if x = y then raise (Error1("x"))
      else raise (Error2("x", 10))
   with
      | Error1(str) -> printfn "Error1 %s" str
      | Error2(str, i) -> printfn "Error2 %s %d" str i

function1 10 10
function1 9 2

Tipp

Das try...with-Konstrukt und der try...finally-Ausdruck sind zwei eigene Ausdrücke. Wenn im Code ein finally-Block und ein with-Block erforderlich sind, müssen Sie daher die beiden Ausdrücke schachteln.

Tipp

Sie können try...with in asynchronen Workflows und anderen Berechnungsausdrücken verwenden. In diesem Fall wird eine benutzerdefinierte Version des try...with-Ausdrucks verwendet. Weitere Informationen finden Sie unter Asynchrone Workflows (F#) und Berechnungsausdrücke (F#).

Siehe auch

Referenz

Ausnahmetypen (F#)

Ausnahmen: Der try...finally-Ausdruck (F#)

Weitere Ressourcen

Ausnahmebehandlung (F#)