Menu
Coddy logo textTech

begin / rescue

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

Pour empêcher une exception de faire planter votre programme, enveloppez le code risqué dans begin ... rescue ... end. Si quoi que ce soit à l'intérieur de begin lève une exception, Ruby saute au bloc rescue correspondant au lieu de s'interrompre.

begin
  result = 10 / 0
  puts result
rescue ZeroDivisionError
  puts "Cannot divide by zero!"
end
# Cannot divide by zero!

Vous pouvez récupérer l'objet d'exception lui-même avec => e et lire son .message :

begin
  Integer("hello")
rescue ArgumentError => e
  puts "Bad input: #{e.message}"
end
# Entrée invalide : valeur non valide pour Integer() : "hello"

Si vous ne nommez pas de classe d'exception, rescue seul intercepte StandardError et ses descendants, soit la plupart des erreurs courantes. L'interception est particulièrement utile lorsque vous pouvez faire quelque chose dans le bloc rescue : substituer une valeur par défaut, enregistrer le problème, ou redemander à l'utilisateur.

challenge icon

Défi

Facile

Lisez deux lignes à partir de l'entrée, les deux devraient être des entiers, mais la deuxième pourrait ne pas être un nombre valide.

Enveloppez l'analyse de la deuxième ligne dans un bloc begin / rescue :

  • Utilisez Integer(input) (qui lève une ArgumentError sur une chaîne de caractères incorrecte)
  • Si l'analyse réussit, affichez Sum: <a + b>
  • Si elle échoue, affichez Bad number!

Pour l'entrée 3 puis 4, la sortie est Sum: 7. Pour 3 puis abc, c'est Bad number!.

Aide-mémoire

Utilisez begin ... rescue ... end pour gérer les exceptions sans faire planter le programme :

begin
  result = 10 / 0
rescue ZeroDivisionError
  puts "Cannot divide by zero!"
end

Capturez l'objet d'exception avec => e pour accéder à son message :

begin
  Integer("hello")
rescue ArgumentError => e
  puts "Bad input: #{e.message}"
end

L'utilisation de rescue sans classe intercepte StandardError et ses descendants.

Essayez vous-même

a = gets.to_i
raw_b = gets.chomp

# À FAIRE : utiliser begin/rescue autour de Integer(raw_b) ; afficher la somme ou "Bad number !"
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