Wyjątki: try...with — Wyrażenie

W tym temacie opisano try...with wyrażenie , wyrażenie, które jest używane do obsługi wyjątków w języku F#.

Składnia

try
    expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...

Uwagi

Wyrażenie try...with służy do obsługi wyjątków w języku F#. Jest ona podobna do instrukcji try...catch w języku C#. W poprzedniej składni kod w wyrażeniu1 może wygenerować wyjątek. Wyrażenie try...with zwraca wartość. Jeśli nie zostanie zgłoszony żaden wyjątek, całe wyrażenie zwraca wartość wyrażenia expression1. Jeśli zgłaszany jest wyjątek, każdy wzorzec jest porównywany z kolei z wyjątkiem, a dla pierwszego zgodnego wzorca odpowiednie wyrażenie, znane jako procedura obsługi wyjątków, dla tej gałęzi jest wykonywane, a wyrażenie ogólne zwraca wartość wyrażenia w tym procedurze obsługi wyjątków. Jeśli żaden wzorzec nie jest zgodny, wyjątek propaguje stos wywołań do momentu znalezienia zgodnej procedury obsługi. Typy wartości zwracanych z każdego wyrażenia w programach obsługi wyjątków muszą być zgodne z typem zwracanym z wyrażenia w try bloku.

Często fakt, że wystąpił błąd, oznacza również, że nie ma prawidłowej wartości, którą można zwrócić z wyrażeń w każdej procedurze obsługi wyjątków. Częsty wzorzec polega na tym, że typ wyrażenia jest typem opcji. Poniższy przykład kodu ilustruje ten wzorzec.

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ątkami platformy .NET lub mogą być wyjątkami języka F#. Wyjątki języka F# można zdefiniować przy użyciu słowa kluczowego exception .

Można użyć różnych wzorców do filtrowania według typu wyjątku i innych warunków; opcje zostały podsumowane w poniższej tabeli.

Wzorzec opis
:? typ wyjątku Pasuje do określonego typu wyjątku .NET.
:? typ wyjątku jako identyfikator Pasuje do określonego typu wyjątku .NET, ale daje wyjątek nazwanej wartości.
exception-name(argumenty) Pasuje do typu wyjątku F# i wiąże argumenty.
identifier Pasuje do dowolnego wyjątku i wiąże nazwę z obiektem wyjątku. Odpowiednik : ? System.Exception jakoidentyfikator
identyfikator , gdy warunek Pasuje do dowolnego wyjątku, jeśli warunek ma wartość true.

Przykłady

Poniższe przykłady kodu ilustrują użycie 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

Konstrukcja try...with jest oddzielnym wyrażeniem try...finally od wyrażenia. W związku z tym, jeśli kod wymaga zarówno with bloku, jak finally i bloku, musisz zagnieżdżać dwa wyrażenia.

Uwaga

Można użyć try...with w wyrażeniach asynchronicznych, wyrażeniach zadań i innych wyrażeniach obliczeniowych, w tym przypadku jest używana niestandardowa wersja try...with wyrażenia. Aby uzyskać więcej informacji, zobacz Wyrażenia asynchroniczne, Wyrażenia zadań i Wyrażenia obliczeniowe.

Zobacz też