在Ruby中捕获异常后重新获取(相同的异常)

时间:2014-05-20 22:19:12

标签: ruby exception

我试图通过捕获异常来提高我的Ruby技能。我想知道当你有几个方法调用时,是否通常会重新提出相同类型的异常。那么,以下代码是否有意义?是否可以重新引用相同类型的异常,或者我不应该在处理方法上捕获它?

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

3 个答案:

答案 0 :(得分:92)

有时我们只是想知道错误发生,而不必实际处理错误。

通常情况是负责处理错误的人是对象的用户:调用者。如果我们对错误感兴趣但又不想承担这个责任怎么办?我们拯救错误,做我们需要做的任何事情,然后将信号传播到堆栈中,好像什么都没发生一样。

例如,如果我们想记录错误消息然后让调用者处理它呢?

begin
  this_will_fail!
rescue Failure => error
  log.error error.message
  raise
end

在没有任何参数的情况下调用raise将引发最后一个错误。就我们而言,我们正在重新提升error

在您的问题中提供的示例中,根本不需要重新引发错误。你可以简单地让它自然地向上传播。您的示例中唯一的区别是您正在创建一个新的错误对象并提升它而不是重新提升最后一个。

答案 1 :(得分:1)

这将引发与原始错误相同的错误,但是您可以自定义消息。

rescue StandardError => e
  raise e.class, "Message: #{e.message}"

答案 2 :(得分:-4)

不是真的,你需要问自己的问题是你需要这些信息在哪里? 在你的情况下,我会在本地捕获它并返回false(注意呼叫失败)。