2013-04-28 63 views
1

存在原始異常類,它是StandardError的一個子類,其例外情況引發爲raise RequiredArgumentMissingError 'message'。在我的應用程序中,我需要更改此類,以便將其例外顯示給用戶ERROR: message。如何更改原始異常類以將其部分消息添加到它?更改Ruby異常類以將文本預加到原始異常消息

原來的異常類:

class Thor 
    class RequiredArgumentMissingError < StandardError 
    end 
end 

我的應用程序:

class CLI < Thor 
    class RequiredArgumentMissingError 
    # I need to prepend 'ERROR: ' to the original exception message here 
    end 
end 

編輯我不明確我的應用程序提高RequiredArgumentMissingError,它是由其他類/方法Thor類提高。所以我實際上不能從中繼承,但我需要保留原來的類名,但改變實現。這可能嗎?

+0

如果你做一個'養RequiredArgumentMissingError「消息「,你會得到」RequiredArgumentMissingError:message「作爲消息。 – tessi 2013-04-28 08:48:46

+0

你確定'raise'message''引發異常類嗎? http://ruby-doc.org/core-2.0/Kernel.html#method-i-raise表示引發一個字符串總是會引發一個RuntimeError。 – Dogbert 2013-04-28 08:49:26

回答

2

請注意,即使CLI是Thor的子類,CLI::RequiredArgumentMissingError != Thor::RequiredArgumentMissingError如果您再次在CLI中定義內部類。 Thor類中的原始方法將引發Thor::RequiredArgumentMissingError類。所以你想重新定義這個類。實現你想要的最簡單的方法是定義初始化方法。

class Thor 
    class RequiredArgumentMissingError 
     def initialize str 
      super("ERROR: "+str) 
     end 
    end 
end 
的情況下

初始化已經定義並是複雜的,你可以別名,並調用原初始化方法從覆蓋一個這樣的:

class Thor 
    class RequiredArgumentMissingError 
     alias :orig_initialize :initialize 
     def initialize msg 
      orig_initialize("ERROR: "+msg) 
     end 
    end 
end 
+0

當我應該重新定義RequiredArgumentMissingError時,爲什麼要重新定義RuntimeError? – 2013-04-28 09:06:44

+0

然後我誤解了你的問題 - 正如你指出的那樣,「raise」text「'總是會引發RuntimeError。你當然可以在'Exception'的任何子類中做同樣的事情。 但是,如果RequiredArgumentMissingError是你的類,那麼你當然可以在沒有別名的情況下更乾淨。 – petrch 2013-04-28 09:10:29

+0

對不起,那是我的錯,我編輯了原帖。我提出RequiredArgumentMissingError。而RequiredArgumentMissingError不是我的課程,而是一種寶石級別​​,所以我只能重新定義它,而不是子類。 – 2013-04-28 09:14:48