Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird der try...with Ausdruck, der für die Ausnahmebehandlung in F# verwendet wird, beschrieben.
Syntax
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Bemerkungen
Der try...with Ausdruck wird verwendet, um Ausnahmen in F# zu behandeln. Sie ähnelt der try...catch Anweisung in C#. In der vorherigen Syntax kann der Code in Expression1 eine Ausnahme generieren. 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, wird jedes Muster wiederum mit der Ausnahme verglichen, und für das erste Abgleichsmuster wird der entsprechende Ausdruck, der als Ausnahmehandler bezeichnet wird, für diese Verzweigung ausgeführt, und der Gesamtausdruck gibt den Wert des Ausdrucks in diesem Ausnahmehandler zurück. Wenn kein Muster übereinstimmt, verteilt die Ausnahme den Aufrufstapel, bis ein übereinstimmenden Handler gefunden wird. Die Typen der werte, die von jedem Ausdruck in den Ausnahmehandlern zurückgegeben werden, müssen mit dem Typ übereinstimmen, der vom Ausdruck im try Block zurückgegeben wird.
Häufig bedeutet die Tatsache, dass ein Fehler aufgetreten ist, dass es keinen gültigen Wert gibt, der von den Ausdrücken in jedem Ausnahmehandler zurückgegeben werden kann. Ein häufiges Muster besteht darin, dass der Typ des Ausdrucks ein Optionstyp sein soll. Das folgende Codebeispiel veranschaulicht dieses Muster.
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 sein, oder sie können F#-Ausnahmen sein. Sie können F#-Ausnahmen mithilfe des Schlüsselworts exception definieren.
Sie können eine Vielzahl von Mustern verwenden, um nach dem Ausnahmetyp und anderen Bedingungen zu filtern. die Optionen sind in der folgenden Tabelle zusammengefasst.
| Muster | BESCHREIBUNG |
|---|---|
| :? Ausnahmetyp | Entspricht dem angegebenen .NET-Ausnahmetyp. |
| :? Ausnahmetyp als Bezeichner | Entspricht dem angegebenen .NET-Ausnahmetyp, gibt jedoch die Ausnahme einen benannten Wert an. |
| exception-name(arguments) | Entspricht einem F#-Ausnahmetyp und bindet die Argumente. |
| Bezeichner | Entspricht einer Ausnahme und bindet den Namen an das Ausnahmeobjekt. Entspricht :? System.Exception alsBezeichner |
| Bezeichner bei Bedingung | Entspricht einer Ausnahme, wenn die Bedingung "true" ist. |
Beispiele
Die folgenden Codebeispiele veranschaulichen die Verwendung der verschiedenen Ausnahmehandlermuster.
// 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 vom try...finally Ausdruck. Wenn Ihr Code daher sowohl einen with Block als auch einen finally Block erfordert, müssen Sie die beiden Ausdrücke schachteln.
Hinweis
Sie können in asynchronen Ausdrücken, Aufgabenausdrücken und anderen Berechnungsausdrücken verwenden try...with , 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.