Výjimky: Výraz try...with (F#)
Toto téma popisuje try...with výraz, výraz, který se používá pro zpracování výjimek v jazyce F#.
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Poznámky
try...with Výraz se používá ke zpracování výjimek v F#.Je podobný try...catch prohlášení v jazyce C#.V předchozím syntaxi kód v expression1 vygenerovat výjimku.try...with Výraz vrací hodnotu.Pokud žádná výjimka celý výraz vrací hodnotu expression1.Pokud je vyvolána výjimka, každý pattern je v porovnání s výjimkou a první odpovídající vzorek odpovídající expression, označovaný jako zpracování výjimek, pro provedení takové pobočky a celkového výrazu vrátí hodnotu výrazu v dané zpracování výjimek.Pokud žádný vzorek odpovídá, výjimka rozšíří až zásobník volání, dokud není nalezen odpovídající popisovač.Typy hodnot vrácených z každého výrazu v popisovačích výjimek musí odpovídat typu vrácená z výrazu v try bloku.
Často skutečnost, že došlo také znamená, že žádná platná hodnota vrácená z výrazů v každém zpracování výjimek.Časté vzorek je typ výrazu je typ možnosti.Následující příklad kódu ukazuje tento vzorek.
let divide1 x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divide1 100 0
Výjimky mohou být.NET výjimky nebo mohou mít F# výjimky.F# výjimky pomocí exception klíčové slovo.
Různé vzorky lze filtrovat typ výjimky a jiné podmínky; Možnosti jsou shrnuty v následující tabulce.
Maska |
Description |
---|---|
:?exception-type |
Shoduje se zadanou.Typ výjimky NET. |
:?exception-typejakoidentifier |
Shoduje se zadanou.NET typ výjimky, ale poskytuje výjimku pojmenovanou hodnotu. |
exception-name(arguments) |
Odpovídá typu Výjimka F# a vazba argumenty. |
identifier |
Odpovídá jakékoli výjimky a sváže název objektu výjimku.Rovnocenné :? System.Exception as identifikátor |
identifierPřicondition |
Odpovídá jakékoli výjimky, pokud je podmínka splněna. |
Příklady
Následující kód příklady ilustrují použití různých vzorků popisovač výjimky.
// 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]
try...with Konstrukci je samostatný výraz z try...finally výraz.Proto pokud kód vyžaduje jak with bloku a finally blok, bude mít dva výrazy vnořit.
[!POZNÁMKA]
Můžete použít try...with v asynchronní pracovní postupy a dalších výpočtu výrazů, ve kterém případě upravenou verzi try...with výrazu.Další informace naleznete v tématu Asynchronní pracovní postupy (F#) a Výpočetní výrazy (F#).
Viz také
Referenční dokumentace
Výjimky: Výraz try...finally (F#)