Gestion des exceptions : ensure

Quand une méthode s’achève il peut y avoir du travail de nettoyage à effectuer à coup sûr. Peut-être qu’un fichier ouvert doit être refermé, que de la donnée bufferisée doit être transmise, etc. S’il y avait toujours un seul point de sortie pour chaque méthode, nous pourrions avec confiance placer notre code de nettoyage à cet endroit-là et savoir qu’il serait exécuté ; mais une méthode a souvent plusieurs sorties, et notre code de nettoyage pourrait être sauté à cause d’une exception.


begin
 file = open("/tmp/some_file", "w")
 # ... écrit dans le fichier ...
 file.close
end

Ci-dessus, qu’une exception survienne pendant que la section de code où nous écrivons dans le fichier, et le fichier restera ouvert. Et nous préférerions éviter le genre de redondance qui suit :


begin
 file = open("/tmp/some_file", "w")
 # ... écrit dans le fichier ...
 file.close
rescue
 file.close
 fail # soulève une exception
end

C’est lourd, et devient ingérable lorsque le code se complique parce que nous avons à gérer un tas de return et break.

Pour cette raison, nous pouvons ajouter un autre mot-clé à la séquence “begin…rescue…end”, et c’est ensure (garantit que). Le bloc ensure s’exécute, que le bloc begin réussisse ou pas.


begin
 file = open("/tmp/some_file", "w")
 # ... écrit dans le fichier ...
rescue
 # ... gère les exceptions ...
ensure
 file.close   # ... et ceci arrive dans tous les cas.
end

Il est possible d’utiliser ensure sans rescue, ou le contraire, mais s’il sont utilisés dans le même bloc begin…end, alors le rescue doit précéder le ensure.

Guide de l’utilisateur

Précédent : GDU : Gestion des exceptions : rescue Suivant : GDU : Accesseurs