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.