2014-11-04 30 views
1

在下面,通過['a', nil, 'c']迭代將在nil失敗,因爲你不能做nil + 'd'。我想挽救那條消息,修改它,並將它傳遞給另一個存儲錯誤的方法。如何修改救援條款中的異常消息?

number = 0 
begin 
    ['a', nil, 'c'].each_with_index do |entry, i| 
    entry + 'd' 
    number = i 
    end 
rescue => e 
    e.message="#{e.message} (happened at entry: #{number})" 
    store_exception(e) 
end 

問題是,方法message=不存在。我該怎麼做?

回答

0

答案,但稍微更加「花哨」:

class ProxyException < BasicObject 
    def initialize(exception, message=nil) 
    @exception, @message = exception, message 
    end 

    def message 
    @message || @exception.message 
    end 

    def method_missing(method_name, *args, &block) 
    @exception.public_send(method_name, *args, &block) 
    end 
end 

然後簡單:

number = 0 
begin 
    ['a', nil, 'c'].each_with_index do |entry, i| 
    entry + 'd' 
    number = i 
    end 
rescue => e 
    e = ProxyException.new e, "#{e.message} (happened at entry: #{number})" 
    store_exception(e) 
end 

ProxyException是因爲它代表所有的方法完全不可見,包括classobject_id到異常對象,因此它保留異常類和回溯。

3

您可以創建自定義的異常,並把它作爲一個代理對象

class ProxyException < StandardError; end 

number = 0 
begin 
    ['a', nil, 'c'].each_with_index do |entry, i| 
    entry + 'd' 
    number = i 
    end 
rescue => e 
    e = ProxyException.new "#{e.message} (happened at entry: #{number})" 
    store_exception(e) 
end 
+0

這裏唯一的問題是它也改變了異常的類。 – BroiSatse 2014-11-04 13:12:49

+0

@BroiSatse做的OP想要原始的Exception類嗎? – fl00r 2014-11-04 13:15:40

+0

@ fl004 - 這個問題沒有說明。然而,由於想要修改異常消息而不是僅僅記錄修改後的版本,它會提示store_exception方法在出現異常時更加複雜。使用ProxyException也會修改回溯。 – BroiSatse 2014-11-04 13:24:15

0

一般情況下,你不應該使用的預期情況下的例外(問自己:我的代碼工作,如果我刪除所有的異常處理代碼?)。這是預期的情況下,你可以通過調用緊湊陣列傳遞給each_with_index之前容易避免:根據@ fl00r答案

['a', nil, 'c'].compact #=> ["a", "c"] 
+1

關於這個答案的複雜感受 - 它可能不是所期望的行爲,所有OP要求的是更好地記錄異常消息的方式。你的回答在如何解決這個問題上可能是正確的,但問題本身可能只是一個例子,因此你不是針對這個問題本身。 – BroiSatse 2014-11-04 13:08:16