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@()