Výjimky: Výraz try...with
Toto téma popisuje try...with
výraz, který se používá pro zpracování výjimek v jazyce F#.
Syntaxe
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Poznámky
Výraz try...with
se používá ke zpracování výjimek v jazyce F#. Podobá se try...catch
příkazu v jazyce C#. V předchozí syntaxi může kód ve výrazu1 vygenerovat výjimku. Výraz try...with
vrátí hodnotu. Pokud není vyvolán žádná výjimka, vrátí celý výraz hodnotu výrazu1. Pokud je vyvolána výjimka, porovná se každý vzor s výjimkou a pro první odpovídající vzor, odpovídající výraz, známý jako obslužná rutina výjimky, pro tuto větev se spustí a celkový výraz vrátí hodnotu výrazu v této obslužné rutině výjimky. Pokud žádný vzor neodpovídá, výjimka rozšíří zásobník volání, dokud se nenajde odpovídající obslužná rutina. Typy hodnot vrácených z každého výrazu v obslužných rutinách výjimek se musí shodovat s typem vrácený z výrazu try
v bloku.
Skutečnost, že došlo k chybě, často také znamená, že neexistuje platná hodnota, kterou lze vrátit z výrazů v každé obslužné rutině výjimky. Častým vzorem je mít typ výrazu jako typ možnosti. Následující příklad kódu znázorňuje tento vzor.
let divide1 x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divide1 100 0
Výjimky můžou být výjimky rozhraní .NET nebo můžou být výjimkami jazyka F#. Výjimky jazyka F# můžete definovat pomocí klíčového exception
slova.
K filtrování typu výjimky a dalších podmínek můžete použít různé vzory; možnosti jsou shrnuty v následující tabulce.
Vzor | Popis |
---|---|
:? exception-type | Odpovídá zadanému typu výjimky .NET. |
:? exception-type as identifier | Odpovídá zadanému typu výjimky .NET, ale dává výjimce pojmenovanou hodnotu. |
exception-name(arguments) | Odpovídá typu výjimky jazyka F# a vytvoří vazbu argumentů. |
identifikátor | Odpovídá jakékoli výjimce a vytvoří vazbu názvu na objekt výjimky. Odpovídá :? System.Exception asidentifier |
identifikátor při podmínce | Odpovídá jakékoli výjimce, pokud je podmínka pravdivá. |
Příklady
Následující příklady kódu ilustrují použití různých vzorů obslužné rutiny výjimek.
// 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
Poznámka:
Konstruktor try...with
je samostatný výraz od výrazu try...finally
. Proto pokud váš kód vyžaduje with
blok i finally
blok, budete muset vnořit dva výrazy.
Poznámka:
Můžete použít try...with
v asynchronních výrazech, výrazech úloh a dalších výpočetních výrazech, v takovém případě se používá přizpůsobená verze výrazu try...with
. Další informace najdete v tématu Asynchronní výrazy, výrazy úloh a výpočetní výrazy.