try...catch en Ruby
- Sauvetage avec un message d’erreur générique dans Ruby
- Sauvetage avec le message de l’exception dans Ruby
- Récupérer un type spécifique d’exception dans Ruby
Une exception est un événement indésirable qui se produit pendant l’exécution d’un programme. Un exemple est une ZeroDivisionError
lorsqu’un programme essaie de diviser un nombre par zéro. Récupérer une exception est un moyen de la gérer avec élégance afin qu’elle ne plante pas le programme.
Une exception en Ruby est généralement constituée de deux clauses, begin
et rescue
. La clause begin
est équivalente à try
en Python ou tout autre langage de programmation similaire, tandis que le rescue
est équivalent à catch
. Ci-dessous la syntaxe.
rubyCopybegin
# do something that might cause an exception
rescue
# handle the exception here
end
Écrivons un programme simple qui calcule le pourcentage de profit si on lui donne les prix de vente et de revient du bien.
Exemples de codes :
rubyCopydef profit_percentage(selling_price, cost_price)
profit = selling_price - cost_price
"#{(profit.fdiv(cost_price) * 100)}%"
end
puts profit_percentage(30, 20)
puts profit_percentage(30, nil)
Production :
textCopy50.0%
nil can't be coerced into Integer (TypeError)
Comme nous pouvons le voir dans la sortie ci-dessus, la deuxième invocation de profit_percentage
a généré une erreur car nous avons passé nil
comme cost_price
. Illustrons maintenant différentes façons dont nous aurions pu sauver cette exception.
Sauvetage avec un message d’erreur générique dans Ruby
Le sauvetage avec un message d’erreur générique n’est pas toujours utile car il ne révèle pas la cause première de l’exception.
Exemples de codes :
rubyCopydef profit_percentage(selling_price, cost_price)
begin
profit = selling_price - cost_price
"#{(profit.fdiv(cost_price) * 100)}%"
rescue
"An unknown error occurred."
end
end
puts profit_percentage(30, nil)
Production :
textCopyAn unknown error occurred.
Sauvetage avec le message de l’exception dans Ruby
Cette méthode est pratique si vous n’êtes pas intéressé par le type d’exception levée mais uniquement par le message d’erreur.
Exemples de codes :
rubyCopydef profit_percentage(selling_price, cost_price)
begin
profit = selling_price - cost_price
"#{(profit.fdiv(cost_price) * 100)}%"
rescue => e
e
end
end
puts profit_percentage(30, nil)
Production :
textCopynil can't be coerced into Integer
Récupérer un type spécifique d’exception dans Ruby
Il est utile si vous souhaitez gérer uniquement un type particulier d’exception.
Exemples de codes :
rubyCopydef profit_percentage(selling_price, cost_price)
begin
profit = selling_price - cost_price
"#{(profit.fdiv(cost_price) * 100)}%"
rescue TypeError
"An argument of invalid type was detected"
end
end
puts profit_percentage(30, nil)
Production :
textCopyAn argument of invalid type was detected
En outre, il convient de mentionner qu’il existe une autre clause facultative appelée ensure
, qui pourrait être utile dans les cas où vous devez toujours exécuter du code, qu’une exception ait été déclenchée ou non.
Exemples de codes :
rubyCopydef profit_percentage(selling_price, cost_price)
begin
profit = selling_price - cost_price
puts "#{(profit.fdiv(cost_price) * 100)}%"
rescue => e
puts e
ensure
puts "Done calculating profit %"
end
end
profit_percentage(30, 20)
profit_percentage(30, nil)
Production :
textCopy50.0%
Done calculating profit %
nil can't be coerced into Integer
Done calculating profit %
Comme indiqué dans la sortie ci-dessus, le code de la clause ensure
a été déclenché dans les deux invocations de profit_percentage
. Cette clause est généralement utilisée lorsqu’il est nécessaire de fermer un fichier après avoir effectué certaines opérations sur le fichier, qu’une exception se soit produite ou non.