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

Typy výjimek (F#)

Výjimky: Výraz try...finally (F#)

Další zdroje

Zpracování výjimek (F#)