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

Typy wyjątków (F#)

Wyjątki: try...finally — Wyrażenie (F#)

Inne zasoby

Obsługa wyjątków (F#)