Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
| Wzór | 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. |
| identyfikator | 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 / Notatka
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 / Notatka
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.