我试图了解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
当我运行这个时,我得到的似乎是正确的:
$ ruby errors.rb
charging order soon
This is a runtime error
在跑步者中,我可以使用特定消息从RuntimeError
救出吗?如果我的应用程序周围有多个RuntimeErrors
,那么Runner的救援条款是否有任何方法仅针对具有特定消息的RuntimeErrors引发?
答案 0 :(得分:6)
请参阅https://stackoverflow.com/a/23771227/2981429
如果您在救援区内拨打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
但是,如果您的目标是单独拯救您自己手动引发的错误,那么可能更容易定义自定义错误类:
class MyError < StandardError; end
然后代替raise RuntimeError.new("message")
使用raise MyError.new("message")
,并正常拯救它:
begin
User.new.charge
rescue MyError => e
# handler
end
通过这种方式,您不必担心您的救援会干扰内置异常。