Exceptions : fonctions raise et reraise

  • La fonction raise permet d’indiquer qu’une erreur ou une condition exceptionnelle s’est produite. Les informations relatives à l’erreur sont capturées dans un objet d’exception.
  • La fonction reraise permet de propager une exception prise en charge en amont de la chaîne d’appels.

Syntaxe

raise (expression)

Notes

La fonction raise génère un objet d’exception et lance un processus de déroulement de pile. Le processus de déroulement de pile est managé par le CLR (Common Language Runtime). Le comportement de ce processus est donc le même que celui de n’importe quel autre langage .NET. Le processus de déroulement de pile consiste à rechercher un gestionnaire d’exceptions qui correspond à l’exception générée. La recherche commence dans l’expression try...with actuelle, le cas échéant. Chaque modèle du bloc with est vérifié, dans l’ordre. Quand un gestionnaire d’exceptions correspondant est trouvé, l’exception est considérée comme étant gérée. Sinon, la pile est déroulée et les blocs with en amont de la chaîne d’appels sont vérifiés jusqu’à ce qu’un gestionnaire correspondant soit trouvé. Tous les blocs finally rencontrés dans la chaîne d’appels sont également exécutés les uns après les autres, au fur et à mesure du déroulement de la pile.

La fonction raise équivaut à throw en C# ou en C++.

Les exemples de code suivants illustrent l’utilisation de la fonction raise 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 fonction raise peut également être utilisée pour lever des exceptions .NET, comme le montre l’exemple suivant.

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

Nouvelle levée d’une exception

La fonction reraise peut être utilisée dans un bloc with pour propager une exception prise en charge en amont de la chaîne d’appels. reraise n’accepte pas d’opérande d’exception. Cela est très utile quand une méthode passe un argument d’un appelant à une autre méthode de bibliothèque, et que la méthode de bibliothèque lève une exception qui doit être passée à l’appelant.

La fonction reraise ne peut pas être utilisée sur le bloc with des constructions try/with dans les listes calculées, les tableaux, les séquences ou les expressions de calcul, notamment 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