【问题标题】:Ruby rescue custom exceptionRuby 救援自定义异常
【发布时间】:2018-11-16 14:40:30
【问题描述】:

在下面的例子中:

class Foo
  class MyCustomerror < StandardError
    def message
      "My custom error"
    end
 end

 def self.do_standard
   1 / 0
 rescue StandardError => e
   puts e.message
 end

 def self.do_custom
   1 / 0
 rescue MyCustomerror => e
  puts e.message
 end
end

我遇到了参数是 MyCustomerror 的调用救援块的问题。 如果我调用 Foo.do_standard,则会调用救援块,但是当我调用带有 MyCustomerror 的 Foo.do_custom 救援块时不会调用。问题出在哪里?

【问题讨论】:

  • rescue MyCustomerror 拯救了MyCustomerror 及其子类。但是ZeroDivisionError 不是它的子类之一。

标签: ruby exception custom-exceptions


【解决方案1】:

您的代码中没有任何地方可以引发MyCustomError 异常,因此没有什么可以挽救的。该代码可能引发的唯一异常是ZeroDivisionError

【讨论】:

  • 值得注意的是ZeroDivisionError 继承自StandardError,这就是rescue StandardError 拯救它的原因。
  • 放置或不放置。它没有解释为什么调用方法do_standard 被StandardError 捕获,而不是调用do_custom 不是。
  • @Stefan 在上面的例子中 MyCustomerror 也被 StandardError 继承了!
  • 这两个函数都会引发ZeroDivisionErrorZeroDivisionErrorStandardError 所以 .do_standard 拯救了它。 ZeroDivisionError 不是 MyCustomerror,所以 .do_custom 不能拯救它。
  • @user3471671 反过来:MyCustomerror 继承自 StandardError。在类层次结构中,MyCustomerrorZeroDivisionError 是兄弟姐妹。
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2019-01-11
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多