ensure et raise
Fait partie de la section Logique et Flux du Journey Ruby de Coddy. Leçon 46 sur 56.
Deux éléments supplémentaires 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
# attrapé
# fermeture du fichierraise permet de créer sa propre exception. Passez une chaîne pour le message, ou une classe accompagnée d’un message :
def withdraw(amount)
raise ArgumentError, "amount must be positive" if amount <= 0
# ... effectuer le retrait
endLa convention consiste à utiliser raise tôt, au début d’une méthode, afin d’échouer rapidement lorsque les arguments sont incorrects. L’appelant peut utiliser rescue s’il dispose d’une récupération appropriée, ou laisser l’erreur remonter.
Défi
FacileDéfinissez une méthode safe_divide(a, b) qui :
- lève
ArgumentErroravec le message"b cannot be zero"sib == 0 - sinon renvoie
a / b
Lisez ensuite deux entiers depuis l’entrée. Appelez safe_divide dans begin / rescue / ensure :
- En cas de succès, affichez
Result: <value> - En cas de
ArgumentError, affichezError: <message> - Dans
ensure, affichez toujoursDone.
Pour l’entrée 10 / 2, la sortie est :
Result: 5
Done.Pour l’entrée 10 / 0 :
Error: b cannot be zero
Done.Essayez vous-même
# TODO: définir safe_divide(a, b), lève ArgumentError lorsque b == 0
a = gets.to_i
b = gets.to_i
# TODO: begin ... print Result; rescue ArgumentError => e ... print Error; ensure ... print Done.
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 - Tisseur de chaînes4Blocs, Procs et Lambdas
Qu'est-ce qu'un bloc ?do..end ou accoladesLe mot-clé yieldParamètres de blocProcs et LambdasRécapitulatif - Itérateur personnalisé7Hashes, 2e partie
Hash.new avec valeurs par défautParcourir les hashesHashes imbriquésFusionner et transformerRécapitulatif - Compteur de fréquences10Projet - Dossiers des étudiants
Présentation du projetAjouter un étudiant2Plages
Qu’est-ce qu’une plage ?Méthodes des plagesPlages dans Case / WhenRécapitulatif - Exercices sur les plages5Puissance des Enumerable
Select et RejectChaînage de MapReduce / Injectcount, all?, any?, none?group_by et partitionsort_by, min_by, max_byRécapitulatif - Pipeline de données3Tableaux 2D
Bases des tableaux 2DAccéder aux éléments 2DParcourir les tableaux 2DMotifs courants en 2DRécapitulatif - Opérations sur les matrices6Projet - Gestionnaire de bibliothèque
Vue d’ensemble du projetAjouter un livre9Gestion des erreurs
Qu’est-ce qu’une exception ?begin / rescueClauses rescue multiplesensure et raiseRécapitulatif - Calculatrice sûreEntraînez-vous par vous-même : Compilateur Ruby en ligne