Ausnahmen: Der try...with-Ausdruck

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

Syntax

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

Hinweise

Der Ausdruck try...with wird verwendet, um Ausnahmen in F# zu behandeln. Er ist vergleichbar mit der try...catch-Anweisung in C#. In der obigen Syntax könnte der Code in expression1 eine Ausnahme erzeugen. Der Ausdruck try...with gibt einen Wert zurück. Wenn keine Ausnahme ausgelöst wird, gibt der gesamte Ausdruck den Wert von expression1 zurück. Falls eine Ausnahme ausgelöst wird, wird jedes Muster (engl. „pattern“) nacheinander mit der Ausnahme verglichen, und für das erste übereinstimmende Muster wird der entsprechende Ausdruck – der sogenannte Ausnahmehandler – für diesen Zweig ausgeführt, und der Gesamtausdruck gibt den Wert des Ausdrucks in diesem Ausnahmehandler zurück. Wenn kein Muster übereinstimmt, wird die Ausnahme im Aufrufstapel nach oben weitergegeben, bis ein passender Handler gefunden wird. Die Typen der Werte, die von den einzelnen Ausdrücken in den Ausnahmehandlern zurückgegeben werden, müssen mit dem Typ übereinstimmen, der vom Ausdruck im try-Block zurückgegeben wird.

Häufig ist das Auftreten eines Fehlers auch gleichbedeutend damit, dass es keinen gültigen Wert gibt, der von den Ausdrücken in den einzelnen Ausnahmehandlern zurückgegeben werden kann. Ein häufiges Muster ist die Verwendung eines Optionstyps als Typ des Ausdrucks. Dieses Muster wird im folgenden Codebeispiel veranschaulicht.

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 Schlüsselwort exception definieren.

Sie können eine Vielzahl von Mustern verwenden, um nach dem Ausnahmetyp und anderen Bedingungen zu filtern. Die verfügbaren Optionen sind in der folgenden Tabelle zusammengefasst.

Muster BESCHREIBUNG
:? Ausnahmetyp Entspricht dem angegebenen .NET-Ausnahmetyp.
:? Ausnahmetyp als Bezeichner Entspricht dem angegebenen .NET-Ausnahmetyp, gibt der Ausnahme jedoch einen benannten Wert.
Name der Ausnahme(Argumente) Entspricht einem F#-Ausnahmetyp und legt die Argumente fest.
identifier Entspricht einer beliebigen Ausnahme und bindet den Namen an das Ausnahmeobjekt. Entspricht :? System.Exception als Bezeichner.
Bezeichner when Bedingung Entspricht einer beliebigen Ausnahme, wenn die Bedingung erfüllt ist („true“).

Beispiele

Die folgenden Codebeispiele veranschaulichen die Verwendung der verschiedenen Muster für die Ausnahmebehandlung.

// 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

Hinweis

Das try...with-Konstrukt ist ein separater Ausdruck des try...finally-Ausdrucks. Wenn Ihr Code deshalb sowohl einen with-Block als auch einen finally-Block erfordert, müssen Sie die beiden Ausdrücke schachteln.

Hinweis

Sie können try...with in asynchronen Ausdrücken, Aufgabenausdrücken und anderen Berechnungsausdrücken verwenden. In diesem Fall wird eine angepasste Version des try...with-Ausdrucks verwendet. Weitere Informationen finden Sie unter Asynchrone Ausdrücke, Aufgabenausdrücke und Berechnungsausdrücke.

Weitere Informationen