Eccezioni: espressione try...with

In questo argomento viene descritta l'espressione try...with utilizzata per la gestione delle eccezioni in F#.

Sintassi

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

Osservazioni:

L'espressione try...with viene usata per gestire le eccezioni in F#. È simile all'istruzione try...catch in C#. Nella sintassi precedente, il codice in expression1 potrebbe generare un'eccezione. L'espressione try...with restituisce un valore. Se non viene generata alcuna eccezione, l'intera espressione restituisce il valore di expression1. Se viene generata un'eccezione, ogni criterio viene confrontato a sua volta con l'eccezione e per il primo criterio di corrispondenza, l'espressione corrispondente, nota come gestore eccezioni, per tale ramo viene eseguita e l'espressione complessiva restituisce il valore dell'espressione nel gestore eccezioni. Se nessun criterio corrisponde, l'eccezione si propaga fino a quando non viene trovato un gestore corrispondente. I tipi dei valori restituiti da ogni espressione nei gestori di eccezioni devono corrispondere al tipo restituito dall'espressione nel try blocco.

Spesso, il fatto che si sia verificato un errore significa anche che non esiste alcun valore valido che può essere restituito dalle espressioni in ogni gestore eccezioni. Un criterio frequente deve avere il tipo dell'espressione come tipo di opzione. Nell'esempio di codice seguente viene illustrato questo modello.

let divide1 x y =
   try
      Some (x / y)
   with
      | :? System.DivideByZeroException -> printfn "Division by zero!"; None

let result1 = divide1 100 0

Le eccezioni possono essere eccezioni .NET o possono essere eccezioni F#. È possibile definire eccezioni F# usando la exception parola chiave .

È possibile usare un'ampia gamma di modelli per filtrare in base al tipo di eccezione e ad altre condizioni; Le opzioni sono riepilogate nella tabella seguente.

Modello Descrizione
:? tipo di eccezione Corrisponde al tipo di eccezione .NET specificato.
:? tipo di eccezione come identificatore Corrisponde al tipo di eccezione .NET specificato, ma fornisce all'eccezione un valore denominato.
exception-name(arguments) Trova la corrispondenza con un tipo di eccezione F# e associa gli argomenti.
identificatore Trova la corrispondenza con qualsiasi eccezione e associa il nome all'oggetto eccezione. Equivalente a :? System.Exception comeidentificatore
identificatore quando condizione Trova la corrispondenza con qualsiasi eccezione se la condizione è true.

Esempi

Gli esempi di codice seguenti illustrano l'uso dei vari modelli di gestore eccezioni.

// 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

Nota

Il try...with costrutto è un'espressione separata dall'espressione try...finally . Pertanto, se il codice richiede sia un with blocco che un finally blocco, sarà necessario annidare le due espressioni.

Nota

È possibile usare try...with in espressioni asincrone, espressioni di attività e altre espressioni di calcolo, nel qual caso viene usata una versione personalizzata dell'espressione try...with . Per altre informazioni, vedere Espressioni asincrone, espressioni di attività ed espressioni di calcolo.

Vedi anche