Wyjątki: try...with — Wyrażenie
W tym temacie opisano try...with
wyrażenie , wyrażenie, które jest używane do obsługi wyjątków w języku F#.
Składnia
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Uwagi
Wyrażenie try...with
służy do obsługi wyjątków w języku F#. Jest ona podobna do instrukcji try...catch
w języku C#. W poprzedniej składni kod w wyrażeniu1 może wygenerować wyjątek. Wyrażenie try...with
zwraca wartość. Jeśli nie zostanie zgłoszony żaden wyjątek, całe wyrażenie zwraca wartość wyrażenia expression1. Jeśli zgłaszany jest wyjątek, każdy wzorzec jest porównywany z kolei z wyjątkiem, a dla pierwszego zgodnego wzorca odpowiednie wyrażenie, znane jako procedura obsługi wyjątków, dla tej gałęzi jest wykonywane, a wyrażenie ogólne zwraca wartość wyrażenia w tym procedurze obsługi wyjątków. Jeśli żaden wzorzec nie jest zgodny, wyjątek propaguje stos wywołań do momentu znalezienia zgodnej procedury obsługi. Typy wartości zwracanych z każdego wyrażenia w programach obsługi wyjątków muszą być zgodne z typem zwracanym z wyrażenia w try
bloku.
Często fakt, że wystąpił błąd, oznacza również, że nie ma prawidłowej wartości, którą można zwrócić z wyrażeń w każdej procedurze obsługi wyjątków. Częsty wzorzec polega na tym, że typ wyrażenia jest typem opcji. Poniższy przykład kodu ilustruje ten wzorzec.
let divide1 x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divide1 100 0
Wyjątki mogą być wyjątkami platformy .NET lub mogą być wyjątkami języka F#. Wyjątki języka F# można zdefiniować przy użyciu słowa kluczowego exception
.
Można użyć różnych wzorców do filtrowania według typu wyjątku i innych warunków; opcje zostały podsumowane w poniższej tabeli.
Wzorzec | opis |
---|---|
:? typ wyjątku | Pasuje do określonego typu wyjątku .NET. |
:? typ wyjątku jako identyfikator | Pasuje do określonego typu wyjątku .NET, ale daje wyjątek nazwanej wartości. |
exception-name(argumenty) | Pasuje do typu wyjątku F# i wiąże argumenty. |
identifier | Pasuje do dowolnego wyjątku i wiąże nazwę z obiektem wyjątku. Odpowiednik : ? System.Exception jakoidentyfikator |
identyfikator , gdy warunek | Pasuje do dowolnego wyjątku, jeśli warunek ma wartość true. |
Przykłady
Poniższe przykłady kodu ilustrują użycie różnych wzorców obsługi wyjątków.
// 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
Uwaga
Konstrukcja try...with
jest oddzielnym wyrażeniem try...finally
od wyrażenia. W związku z tym, jeśli kod wymaga zarówno with
bloku, jak finally
i bloku, musisz zagnieżdżać dwa wyrażenia.
Uwaga
Można użyć try...with
w wyrażeniach asynchronicznych, wyrażeniach zadań i innych wyrażeniach obliczeniowych, w tym przypadku jest używana niestandardowa wersja try...with
wyrażenia. Aby uzyskać więcej informacji, zobacz Wyrażenia asynchroniczne, Wyrażenia zadań i Wyrażenia obliczeniowe.