J'essaie d'améliorer mes compétences Ruby en interceptant des exceptions. Je veux savoir s'il est courant de relancer le même type d'exception lorsque vous avez plusieurs appels de méthode. Donc, le code suivant ferait-il Est-il correct de relancer le même type d'exception, ou ne dois-je pas l'attraper sur la méthode de processus?
class Logo
def process
begin
@processed_logo = LogoProcessor::create_image(self.src)
rescue CustomException
raise CustomException
end
end
end
module LogoProcessor
def self.create_image
raise CustomException if some_condition
end
end
Parfois, nous voulons simplement savoir qu'une erreur s'est produite , sans avoir à gérer l'erreur.
Il arrive souvent que le responsable du traitement des erreurs soit l'utilisateur de l'objet: l'appelant. Et si nous sommes intéressés par l'erreur, mais ne voulons pas assumer cette responsabilité? Nous sauvons l'erreur, faisons tout ce que nous devons faire, puis propagons le signal dans la pile comme si de rien n'était.
Par exemple, que se passe-t-il si nous voulons enregistrer le message d'erreur et laisser l'appelant s'en occuper?
begin
this_will_fail!
rescue Failure => error
log.error error.message
raise
end
Appeler raise
sans aucun argument déclenchera la dernière erreur. Dans notre cas, nous relançons error
.
Dans l'exemple que vous avez présenté dans votre question, relancer l'erreur n'est tout simplement pas nécessaire. Vous pouvez simplement le laisser se propager naturellement dans la pile. La seule différence dans votre exemple est que vous créez un nouvel objet d'erreur et que vous le relevez au lieu de relancer le dernier.
Cela générera le même type d'erreur que l'original, mais vous pouvez personnaliser le message.
rescue StandardError => e
raise e.class, "Message: #{e.message}"