【问题标题】:Tagging exceptions in Ruby, an explanation/alternative在 Ruby 中标记异常,一种解释/替代方法
【发布时间】:2014-11-23 13:32:42
【问题描述】:

如果您有自己的库,我已经阅读了一个标记您自己的异常的提示:

module AcmeHttp
  module Error; end
end

begin
  begin
    raise IOError, "Some IO error"
  rescue Exception => error
    error.extend(AcmeHttp::Error)
    raise
  end
rescue AcmeHttp::Error => error
  puts "Rescued AcmeHttp::Error: #{error}"
end

我不确定error.extend(AcmeHttp::Error) 是如何工作的,以及以后如何才能真正使用它进​​行救援。另外,是否有一些更优雅的方法来标记您自己的库中的异常?

【问题讨论】:

标签: ruby exception-handling


【解决方案1】:

Object#extend 将一个或多个模块的实例方法添加到接收者对象中。

因此,当您执行error.extend(AcmeHttp::Error) 时,您实际上是将AcmeHttp::Error 模块的实例方法添加到error,这是一个异常(实际上是一个类对象)。

【讨论】:

  • 为什么 AcmeHttp::Error 匹配救援?
  • 因为extend 使AcmeHttp::Error 成为error 的单例类的超类。就像@DaveNewton 在他对您的问题的评论中一样,extend 与异常无关,它只是基本的 Ruby。
  • @Jörg W Mittag 有没有办法看到这个祖先链,就像你做 AnyClass.ancestors 一样(只是这次,它是针对对象的)?
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2020-08-04
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多