Sdílet prostřednictvím


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.

Viz také