【问题标题】:Can not catch exception in ruby无法在 ruby​​ 中捕获异常
【发布时间】:2010-10-10 21:57:55
【问题描述】:
class Collector
  class ContentNotFound < Exception
  end

  class DuplicateContent < Exception
  end
end

begin
  raise Collector::ContentNotFound.new
rescue
  puts "catch"
end

当我运行脚本时,我没有收到“catch”消息,但我看到了错误:

lib/collector/exception.rb:10:in `<main>': Collector::ContentNotFound (Collector::ContentNotFound)

为什么?如何在没有在救援中键入它们的类的情况下捕获我的异常?

【问题讨论】:

  • 您不需要.new - 您只需拥有raise Collector::ContentNotFound。 ruby 魔法的所有部分。

标签: ruby exception


【解决方案1】:

如果您真的想按原样捕获这些异常,请使用:

rescue Exception

rescue 关键字仅捕获 StandardError 的派生词(有充分理由)。

但是,更好的解决方案是让您的自定义异常派生自 StandardError

有关为什么会这样的解释,请参阅 PickAxe 的 this section

【讨论】:

  • 投反对票的原因?它回答了这个问题,并提供了基于 ruby​​ 最佳实践的更好的解决方案?
  • Downvode 不是我的。感谢您的回答
  • @Jacon:目前只有一个赞成票,没有反对票。当我第一次阅读您的答案时,我简要地对其进行了否决,因为它提倡rescue Exception,但是当我看到您提到自定义异常应源自StandardError时取消了否决。
  • 啊,这说明了。值得注意的是rescue Exception 是不好的做法,所以我会添加它。
【解决方案2】:

请参阅此帖子以获得解释:

https://stackoverflow.com/questions/383229/common-programming-mistakes-for-ruby-developers-to-avoid/2019170#2019170

基本上是可以的

class ContentNotFound < RuntimeError
end

无需在rescue 语句中指定异常类即可捕获它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 2010-10-29
    • 1970-01-01
    • 2021-08-07
    • 2021-10-14
    • 2019-11-27
    • 2014-05-02
    相关资源
    最近更新 更多