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 fichierraise 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
endLa 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.
Défi
FacileDéfinissez une méthode safe_divide(a, b) qui :
- Lève une
ArgumentErroravec le message"b cannot be zero"sib == 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, 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.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"
endraise crée une exception. Passez une classe et un message pour lever un type spécifique :
raise ArgumentError, "amount must be positive" if amount <= 0Convention : 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.
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