Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette rubrique décrit l’expression try...with
, l’expression utilisée pour la gestion des exceptions dans F#.
Syntaxe
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Remarques
L’expression try...with
est utilisée pour gérer les exceptions dans F#. Il est similaire à l’instruction try...catch
en C#. Dans la syntaxe précédente, le code 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 d’expression1. Si une exception est levée, chaque modèle est comparé à son tour à l’exception, et pour le premier modèle correspondant, 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 propage 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 try
bloc.
Fréquemment, le fait qu’une erreur s’est produite signifie également qu’il n’existe aucune valeur valide qui peut être retournée à partir des expressions de chaque gestionnaire d’exceptions. Un modèle fréquent consiste à avoir le type de l’expression comme 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 elles peuvent être des exceptions F#. Vous pouvez définir des exceptions F# à l’aide du exception
mot clé.
Vous pouvez utiliser un large éventail de modèles pour filtrer sur le type d’exception et d’autres conditions ; les options sont résumées dans le tableau suivant.
Modèle | Descriptif |
---|---|
:? type d’exception | Correspond au type d’exception .NET spécifié. |
:? type d’exception en tant qu’identificateur | Correspond au type d’exception .NET spécifié, mais donne à l’exception une valeur nommée. |
exception-name(arguments) | Correspond à un type d’exception F# et lie les arguments. |
identificateur | Correspond à n’importe quelle exception et lie le nom à l’objet d’exception. Équivalent à :? System.Exception en tant qu’identificateur |
identificateur lorsque la 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
Remarque
La try...with
construction est une expression distincte de l’expression try...finally
. Par conséquent, si votre code nécessite à la fois un with
bloc et un finally
bloc, vous devez imbriquer les deux expressions.
Remarque
Vous pouvez utiliser try...with
dans des expressions asynchrones, des expressions de tâche et d’autres expressions de calcul, auquel 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.