Partager via


Exceptions : déclencher et rétablir les fonctions

  • La raise fonction est utilisée pour indiquer qu’une erreur ou une condition exceptionnelle s’est produite. Des informations sur l’erreur sont capturées dans un objet d’exception.
  • La reraise fonction est utilisée pour propager une exception gérée vers le haut de la chaîne d’appels.

Syntaxe

raise (expression)

Remarques

La raise fonction génère un objet d’exception et lance un processus de déroulement de pile. Le processus de déroulement de la pile est géré par le Common Language Runtime (CLR), de sorte que le comportement de ce processus est le même que dans n’importe quel autre langage .NET. Le processus de déroulement de la pile est une recherche d’un gestionnaire d’exceptions qui correspond à l’exception générée. La recherche commence dans l’expression actuelle try...with , s’il en existe un. Chaque modèle du bloc est vérifié, dans l’ordre with . Lorsqu’un gestionnaire d’exceptions correspondant est trouvé, l’exception est considérée comme gérée ; sinon, la pile est déwound et with bloque la chaîne d’appels jusqu’à ce qu’un gestionnaire correspondant soit trouvé. Tous les finally blocs rencontrés dans la chaîne d’appels sont également exécutés en séquence en tant que déroulement de la pile.

La raise fonction est l’équivalent de throw C# ou C++.

Les exemples de code suivants illustrent l’utilisation de la raise fonction pour générer une exception.

exception InnerError of string
exception OuterError of string

let function1 x y =
   try
     try
        if x = y then raise (InnerError("inner"))
        else raise (OuterError("outer"))
     with
      | InnerError(str) -> printfn "Error1 %s" str
   finally
      printfn "Always print this."


let function2 x y =
  try
     function1 x y
  with
     | OuterError(str) -> printfn "Error2 %s" str

function2 100 100
function2 100 10

La raise fonction peut également être utilisée pour déclencher des exceptions .NET, comme illustré dans l’exemple suivant.

let divide x y =
  if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
  else
     x / y

Réévaluation d’une exception

La reraise fonction peut être utilisée dans un with bloc pour propager une exception gérée vers le haut de la chaîne d’appels. reraise ne prend pas d’opérande d’exception. Il est plus utile lorsqu’une méthode transmet un argument d’un appelant à une autre méthode de bibliothèque et que la méthode de bibliothèque déclenche une exception qui doit être transmise à l’appelant.

La reraise fonction peut ne pas être utilisée sur le with bloc de trywith/constructions dans des listes calculées, des tableaux, des séquences ou des expressions de calcul, y compris task { .. } ou .async { .. }

open System

let getFirstCharacter(value: string) =
    try
        value[0]
    with :? IndexOutOfRangeException as e ->
        reraise()

let s = getFirstCharacter("")
Console.WriteLine($"The first character is {s}")

// The example displays the following output:
//   System.IndexOutOfRangeException: Index was outside the bounds of the array.
//      at System.String.get_Chars(Int32 index)
//      at getFirstCharacter(String value)
//      at <StartupCode>.main@()

Voir aussi