Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
L’expression try...finally vous permet d’exécuter du code de nettoyage même si un bloc de code lève une exception.
Syntaxe
try
expression1
finally
expression2
Remarques
L’expression try...finally peut être utilisée pour exécuter le code dans l’expression2 dans la syntaxe précédente, que l’exception soit générée pendant l’exécution de l’expression1.
Le type d’expression2 ne contribue pas à la valeur de l’expression entière ; le type retourné lorsqu’une exception ne se produit pas est la dernière valeur de l’expression1. Lorsqu’une exception se produit, aucune valeur n’est retournée et le flux des transferts de contrôle vers le gestionnaire d’exceptions correspondant suivant dans la pile des appels. Si aucun gestionnaire d’exceptions n’est trouvé, le programme se termine. Avant que le code d’un gestionnaire correspondant soit exécuté ou que le programme se termine, le code de la finally branche est exécuté.
Le code suivant illustre l’utilisation de l’expression try...finally .
let divide x y =
let stream : System.IO.FileStream = System.IO.File.Create("test.txt")
let writer : System.IO.StreamWriter = new System.IO.StreamWriter(stream)
try
writer.WriteLine("test1")
Some( x / y )
finally
writer.Flush()
printfn "Closing stream"
stream.Close()
let result =
try
divide 100 0
with
| :? System.DivideByZeroException -> printfn "Exception handled."; None
La sortie de la console est la suivante.
Closing stream
Exception handled.
Comme vous pouvez le voir à partir de la sortie, le flux a été fermé avant la gestion de l’exception externe, et le fichier test.txt contient le texte test1, ce qui indique que les mémoires tampons ont été vidées et écrites sur le disque même si le contrôle d’exception a transféré le contrôle vers le gestionnaire d’exceptions externes.
Notez que la try...with construction est une construction distincte de la try...finally construction. Par conséquent, si votre code nécessite à la fois un with bloc et un finally bloc, vous devez imbriquer les deux constructions, comme dans l’exemple de code suivant.
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
Dans le contexte des expressions de calcul, notamment les expressions de séquence et les expressions asynchrones, essayez... enfin , les expressions peuvent avoir une implémentation personnalisée. Pour plus d’informations, consultez Expressions de calcul.