Menu
Coddy logo textTech

Clauses rescue multiples

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

Un bloc begin peut avoir plusieurs clauses rescue. Ruby les vérifie de haut en bas et exécute la première dont la classe d'exception correspond.

begin
  number = Integer(gets.chomp)
  result = 100 / number
  puts result
rescue ArgumentError
  puts "That's not a valid number."
rescue ZeroDivisionError
  puts "Can't divide by zero."
end

L'ordre est important : listez les classes spécifiques avant les classes générales. StandardError placée en premier intercepterait tout et les branches suivantes ne seraient jamais exécutées.

Vous pouvez également intercepter plusieurs classes d'exception dans une seule branche en les listant avec des virgules :

begin
  risky_call
rescue ArgumentError, TypeError => e
  puts "Bad input: #{e.message}"
end

Utilisez ceci lorsque le code de récupération est le même pour plusieurs modes de défaillance.

challenge icon

Défi

Facile

Lisez deux lignes de l'entrée, toutes deux censées être des entiers. Utilisez Integer(...) pour les deux, puis divisez le premier par le second.

Gérez trois cas avec des branches rescue distinctes :

  • ArgumentError → affichez Bad number!
  • ZeroDivisionError → affichez Cannot divide by zero!
  • TypeError → affichez Wrong type!

Si tout fonctionne, affichez Result: <a / b> (division entière).

Pour l'entrée 10 / 2, la sortie est Result: 5. Pour 10 / 0, Cannot divide by zero!. Pour 10 / abc, Bad number!.

Aide-mémoire

Un bloc begin peut avoir plusieurs clauses rescue — Ruby les fait correspondre de haut en bas :

begin
  number = Integer(gets.chomp)
  result = 100 / number
  puts result
rescue ArgumentError
  puts "That's not a valid number."
rescue ZeroDivisionError
  puts "Can't divide by zero."
end

Listez les classes d'exception spécifiques avant les classes générales — une classe générale comme StandardError placée en premier intercepterait toutes les branches suivantes.

Capturez plusieurs classes d'exception dans une seule branche en les séparant par des virgules :

rescue ArgumentError, TypeError => e
  puts "Bad input: #{e.message}"

Essayez vous-même

raw_a = gets.chomp
raw_b = gets.chomp

# TODO: begin ... rescue ArgumentError ... rescue ZeroDivisionError ... rescue TypeError ... end
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