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."
endL'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}"
endUtilisez ceci lorsque le code de récupération est le même pour plusieurs modes de défaillance.
Défi
FacileLisez 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→ affichezBad number!ZeroDivisionError→ affichezCannot divide by zero!TypeError→ affichezWrong 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."
endListez 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
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
1Les chaînes de caractères en profondeur
Aperçu des méthodes de chaînesInterpolation de chaînesParcourir les chaînesSplit et JoinRécapitulatif - String Weaver4Blocs, Procs & Lambdas
Qu'est-ce qu'un bloc ?do..end vs AccoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes - Partie 2
Hash.new avec des valeurs par défautItérer sur les HashesHashes imbriquésFusion et transformationRécapitulatif - Compteur de fréquence10Projet - Dossiers étudiants
Présentation du projetAjouter un étudiant2Intervalles
Qu'est-ce qu'un intervalle ?Méthodes d'intervalleLes intervalles dans Case / WhenRécapitulatif - Pratique des intervalles5La puissance d'Enumerable
Select et RejectChaîner MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Data Pipeline3Tableaux 2D
Bases des tableaux 2DAccéder aux éléments 2DParcourir des tableaux 2DModèles 2D courantsRécapitulatif - Opérations sur les matrices6Projet - Gestionnaire de bibliothèque
Présentation du projetAjouter un livre9Gestion des erreurs
Qu'est-ce qu'une exception ?begin / rescueClauses rescue multiplesensure et raiseRécapitulatif - Calculatrice sécurisée