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.

Voir aussi