try...catch en Ruby

Nurudeen Ibrahim 30 janvier 2023
  1. Sauvetage avec un message d’erreur générique dans Ruby
  2. Sauvetage avec le message de l’exception dans Ruby
  3. Récupérer un type spécifique d’exception dans Ruby
try...catch en 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.

begin
  # 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 :

def 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 :

50.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 :

def 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 :

An 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 :

def 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 :

nil 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 :

def 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 :

An 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 :

def 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 :

50.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.