La capture d’erreurs en Ruby

Publié le

Aujourd’hui, le blog du webdesign vous propose un résumé sur la façon de capturer les erreurs en ruby.

Dans la plupart (tous?) des langages modernes, il existe un système de capture d’erreurs, qui va permettre de définir simplement des manières gracieuses de gérer une erreur. Ruby ne fait heureusement pas exception.

L’outil principal pour cette tâche est begin. Il définit un bloc dans lequel les erreurs seront capturées. La capture s’effectue elle avec rescue.

begin
  # Do something wrong
  impossible_var = 1/0
rescue
  p 'quelque chose de grave est arrive'
  safe_exit
end

Là, notre développeur tente une division par zéro, qui va lever une exception éponyme, et donc planter. Heureusement, la fonction safe_exit sera exécutée quand même, et notre programme aura le temps de mettre de l’ordre dans ses affaires avant de mourir. Cet exemple n’est pas très utile, mais si le 0 est une variable qui peut être égale a 0, on comprend l’intérêt.

Il est possible de capturer certaines erreurs seulement. Pour ça, il faut les indiquer dans le rescue. Notez évidemment que l’on est pas limité à un seul rescue par bloc.

begin
  # Do something
rescue AnError, AnotherError => e
  p "something got wrong: #{e}"
  retry
rescue ATerribleError
  p 'this is terribly wrong'
  exit
ensure
  # This thing NEED to be executed
end

Il y a plusieurs choses remarquables ici: Les types d’erreurs définies après le rescue filtre les erreurs capturées. Le => Après le premier rescue donne une variable (ici e) qui contiendra l’erreur, au cas où l’on veuille l’afficher, ou autre.

Le mot clé retry permet de réexécuter le code contenu dans le begin. Faites attention aux boucles infinies, ça arrive.

ensure, enfin, sera une portion de code qui sera toujours exécutée, que l’action soit sucessfull ou qu’elle plante. 

Si vous comptez capturer toutes les erreurs possible, utilisez bien rescue => e, et pas rescue Exeption => e , sous peine de capturer aussi les messages d’interruption comme ^C. Votre programme en deviendrait impossible à eteindre.

By Benjamin Sanchez

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *