2014-11-23 58 views
0

我读过一个尖端的情况下,标记自己的异常,你有你自己的库:标记异常/替代

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)工作和以后怎么你实际上可以用它来拯救。另外,是否有一些更优雅的方法来标记自己的库中的异常?

+0

'extend'是普通的Ruby。原因是为了捕捉潜在的原因。另一种方法是http://www.jayway.com/2011/05/25/ruby-an-exceptional-language/。 – 2014-11-23 13:41:46

回答

0

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

所以,当你做error.extend(AcmeHttp::Error)你实际上增加了AcmeHttp::Error模块的实例方法error这是一个例外(实际上是一个类对象)。

+0

为什么AcmeHttp :: Error与救援相匹配? – daremkd 2014-11-23 16:09:31

+0

由于'extend'使'AcmeHttp :: Error'成为'error'的单例类的超类。就像@DaveNewton在你的问题上的评论一样,'extend'与异常无关,它只是基本的Ruby。 – 2014-11-23 18:05:26

+0

@JörgW Mittag有没有办法看到这个祖先链,就像你会做AnyClass.ancestors一样(只是这次,它是对象)? – daremkd 2014-11-24 02:23:00