Menu
Coddy logo textTech

ensure et raise

Fait partie de la section Logique et Flux du Journey Ruby de Coddy — leçon 46 sur 56.

Deux autres éléments complètent la boîte à outils de gestion des erreurs.

ensure est un bloc qui s'exécute quoi qu'il arrive, que begin se soit terminé normalement, qu'une branche rescue ait intercepté une exception, ou même si l'exception n'a pas été interceptée. C'est là que vous placez le code de nettoyage :

begin
  puts "opening file"
  raise "something broke"
rescue
  puts "caught it"
ensure
  puts "closing file"
end
# ouverture du fichier
# capturé
# fermeture du fichier

raise est la façon dont vous créez votre propre exception. Passez une chaîne de caractères pour le message, ou une classe plus un message :

def withdraw(amount)
  raise ArgumentError, "amount must be positive" if amount <= 0
  # ... effectuer le retrait
end

La convention est de raise tôt, au début d'une méthode, pour échouer rapidement lorsque les arguments sont incorrects. L'appelant peut rescue s'il dispose d'une solution de récupération raisonnable, ou le laisser remonter.

challenge icon

Défi

Facile

Définissez une méthode safe_divide(a, b) qui :

  • Lève une ArgumentError avec le message "b cannot be zero" si b == 0
  • Sinon, retourne a / b

Ensuite, lisez deux entiers depuis l'entrée. Appelez safe_divide à l'intérieur de begin / rescue / ensure :

  • En cas de succès, affichez Result: <value>
  • En cas de ArgumentError, affichez Error: <message>
  • Dans ensure, affichez toujours Done.

Pour l'entrée 10 / 2, la sortie est :

Result: 5
Done.

Pour l'entrée 10 / 0 :

Error: b cannot be zero
Done.

Aide-mémoire

ensure s'exécute quoi qu'il arrive (sortie normale, secourue ou exception non capturée) — utilisez-le pour le nettoyage :

begin
  raise "something broke"
rescue
  puts "caught it"
ensure
  puts "always runs"
end

raise crée une exception. Passez une classe et un message pour lever un type spécifique :

raise ArgumentError, "amount must be positive" if amount <= 0

Convention : utilisez raise tôt au début d'une méthode pour échouer rapidement en cas de mauvais arguments.

Essayez vous-même

# TODO: définir safe_divide(a, b), lève ArgumentError quand b == 0

a = gets.to_i
b = gets.to_i

# TODO: begin ... print Result; rescue ArgumentError => e ... print Error; ensure ... print Done.
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et Flux