web-dev-qa-db-fra.com

Relancer (même exception) après avoir intercepté une exception dans Ruby

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
57
Hommer Smith

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.

110
Matheus Moreira

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}"
1
FreePender