Exceptions : expression try...with
Cette rubrique décrit l’expression try...with
, qui est utilisée pour la gestion des exceptions en F#.
Syntaxe
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Notes
L’expression try...with
est utilisée pour gérer les exceptions en F#. Elle est similaire à l’instruction try...catch
en C#. Dans la syntaxe précédente, le code contenu dans expression1 peut générer une exception. L’expression try...with
retourne une valeur. Si aucune exception n’est levée, l’expression entière retourne la valeur de expression1. Si une exception est levée, chaque modèle est comparé l’un après l’autre à l’exception. Dès qu’un modèle correspond, l’expression correspondante, appelée gestionnaire d’exceptions pour cette branche est exécutée, et l’expression globale retourne la valeur de l’expression dans ce gestionnaire d’exceptions. Si aucun modèle ne correspond, l’exception se propage dans la pile des appels jusqu’à ce qu’un gestionnaire correspondant soit trouvé. Les types des valeurs retournées par chaque expression dans les gestionnaires d’exceptions doivent correspondre au type retourné par l’expression dans le bloc try
.
Bien souvent, le fait qu’une erreur se soit produite signifie également qu’aucune valeur valide ne peut être retournée par les expressions dans chaque gestionnaire d’exceptions. Un modèle fréquent consiste à avoir un type d’expression qui correspond à un type d’option. L’exemple de code suivant illustre ce modèle.
let divide1 x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divide1 100 0
Les exceptions peuvent être des exceptions .NET ou des exceptions F#. Vous pouvez définir des exceptions F# à l’aide du mot clé exception
.
Vous pouvez utiliser divers modèles pour filtrer le type d’exception et d’autres conditions. Les options sont récapitulées dans le tableau suivant.
Modèle | Description |
---|---|
:? exception-type | Correspond au type d’exception .NET spécifié. |
:? exception-type as identificateur | Correspond au type d’exception .NET spécifié, mais affecte une valeur nommée à l’exception. |
exception-name(arguments) | Correspond à un type d’exception F# et lie les arguments. |
identifier | Correspond à n’importe quelle exception, et lie le nom à l’objet d’exception. Équivaut à : ? System.Exception asidentificateur |
identificateur when condition | Correspond à une exception si la condition est vraie. |
Exemples
Les exemples de code suivants illustrent l’utilisation des différents modèles de gestionnaire d’exceptions.
// 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
Notes
La construction try...with
est une expression distincte de l’expression try...finally
. Ainsi, si votre code nécessite à la fois un bloc with
et un bloc finally
, vous devez imbriquer les deux expressions.
Notes
Vous pouvez utiliser try...with
dans les expressions asynchrones, les expressions de tâche et d’autres expressions de calcul. Dans ce cas, une version personnalisée de l’expression try...with
est utilisée. Pour plus d’informations, consultez Expressions asynchrones, Expressions de tâche et Expressions de calcul.