你能用红宝石中的消息拯救特定的错误吗?

Jwa*_*622 3 ruby

我试图理解Ruby中类之间错误的传播方式.到目前为止我有这个:

class User
  def charge
    puts "charging order soon"
    raise RuntimeError.new("This is a runtime error")
  rescue ArgumentError
    puts "should never gets here"
  end
end

class Runner
  def run
    begin
      User.new.charge
    rescue RuntimeError => e
      puts e.message
    end
  end
end

Runner.new.run
Run Code Online (Sandbox Code Playgroud)

当我运行这个,我得到这似乎是正确的:

$ ruby errors.rb
charging order soon
This is a runtime error
Run Code Online (Sandbox Code Playgroud)

在跑步者内部,我可以从RuntimeError具体消息中救出吗?如果我的RuntimeErrors应用程序周围有多个被引发,有没有办法只为具有特定消息的RuntimeErrors引发Runner的rescue子句?

max*_*ner 6

请参阅/sf/answers/1663985921/

如果您raise在救援区内进行调用,则会重新引发最后一次引发的异常.

在您的例外块中,您可以检查消息并选择是否重新加注:

begin
  User.new.charge
rescue RuntimeError => e
  case e.message
  when "This is a runtime error"
    # put your handler code here
  else
    raise # re-raise the last exception
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,如果您的目标是单独拯救您自己手动引发的错误,那么可能更容易定义自定义错误类:

class MyError < StandardError; end
Run Code Online (Sandbox Code Playgroud)

然后代替raise RuntimeError.new("message")使用raise MyError.new("message"),并正常拯救它:

begin
  User.new.charge
rescue MyError => e
  # handler
end
Run Code Online (Sandbox Code Playgroud)

这样您就不必担心您的救援会干扰内置异常.