2014-11-23 56 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