Wyjątki: try...with — Wyrażenie (F#)
W tym temacie opisano try...with wyrażenie, wyrażenia, która jest używana do obsługi wyjątków w języku F#.
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Uwagi
try...with Wyrażenie jest używany do obsługi wyjątków w F#.Jest on podobny do try...catch instrukcję w języku C#.W poprzednim składni kodu w expression1 może generować wyjątek.try...with Wyrażenie zwróci wartość.Jeśli nie jest wyjątek, całe wyrażenie zwraca wartość expression1.Jeśli wyjątek jest generowany, każdy pattern jest porównywana z kolei, z wyjątkiem i dla pierwszego wzoru dopasowywania odpowiadające im expression, znany jako Obsługa wyjątków, dla tego oddziału jest wykonywany i ogólnej wyrażenie zwraca wartość wyrażenia w tym procedury obsługi wyjątków.Jeśli wzorzec nie odpowiada, wyjątek propaguje górę stosu wywołań do momentu znalezienia pasujących obsługi.Typy wartości zwracane z każdego wyrażenia w procedur obsługi wyjątków musi odpowiadać zwrócone przez wyrażenie w try bloku.
Często fakt, że wystąpił błąd również oznacza jest nie prawidłową wartość zwróconą z wyrażeń w każdej procedury obsługi wyjątków.Częste deseń jest typ wyrażenia typu opcji.Poniższy przykład kodu pokazuje tego wzorca.
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ątki netto, lub może być F# wyjątki.F# wyjątki można zdefiniować za pomocą exception słowa kluczowego.
Różnych wzorców można użyć do filtrowania na typ wyjątku i innych warunków; opcje są podsumowane w tabeli poniżej.
Wzorzec |
Opis |
---|---|
:?exception-type |
Dopasowuje określony.Typ wyjątku netto. |
:?exception-typejakoidentifier |
Dopasowuje określony.NET typ wyjątku, ale daje wyjątek nazwanej wartości. |
exception-name(arguments) |
Pasuje do typu wyjątku F# i powiązanie argumentów. |
identifier |
Dopasowuje każdy wyjątek i wiąże nazwę obiektu wyjątek.Równoważne z :? System.Exception as identyfikator |
identifierKiedycondition |
Dopasowuje każdy wyjątek, jeśli warunek jest spełniony. |
Przykłady
Poniższe przykłady kodu przedstawiają używanie 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]
try...with Konstrukcji jest oddzielne wyrażenie z try...finally wyrażenie.W związku z tym jeśli kod wymaga zarówno with bloku i finally blok, będą musiały zagnieździć dwóch wyrażeń.
[!UWAGA]
Można użyć try...with w Asynchroniczne przepływy pracy i innych obliczeń wyrażeń, w którym sprawa dostosowaną wersję try...with jest używane wyrażenie.Aby uzyskać więcej informacji, zobacz Asynchroniczne przepływy pracy (F#), i Wyrażenia obliczeń (F#).
Zobacz też
Informacje
Wyjątki: try...finally — Wyrażenie (F#)