2010-08-01 81 views
32

您可以創建異常的子類以使其更具描述性,但應該如何設置默認的「消息」?Ruby的異常錯誤類

class MyError < StandardError 
    # default message = "You've triggered a MyError" 
end 

begin 
    raise MyError, "A custom message" 
rescue Exception => e 
    p e.message 
end 

begin 
    raise MyError 
raise Exception => e 
    p e.message 
end 

首先應該輸出「自定義消息」

第二要輸出「你已經引發了MyError」

任何建議,最好的做法?

回答

57

定義一個初始化方法,它將消息作爲參數與默認值一起使用。然後用該消息調用StandardError的初始化方法(使用super)。

class MyError < StandardError 
    def initialize(msg = "You've triggered a MyError") 
    super(msg) 
    end 
end 
+29

只要'超級'就夠了。如果你在沒有參數列表的情況下調用'super',它只會傳遞所有參數,這就是爲什麼當你真的想傳遞* no *參數時,你必須明確地調用'super()'。 – 2010-08-02 01:04:03

+0

@JörgWMittag爲什麼所有的自定義錯誤類繼承自「StandardError」?背後有什麼理由? – 2014-12-27 11:34:26

+0

@ArupRakshit因爲它的安全。無論何時從錯誤中恢復,它應該是一個「StandardError」(或更低),因爲當擊中CTL-C時甚至可能拋出更高級別的錯誤,例如「Exception」。請參閱http://rails-bestpractices.com。/posts/2012/11/01/don-t-rescue-exception-rescue-standarderror – Sean 2015-01-07 22:36:48

1

您也可以覆蓋子類中的message方法,並返回您希望顯示的字符串。我更喜歡這個,因爲如果你想在顯示消息之前做任何有趣的事情,它似乎可以讓事情變得更簡潔。

class CustomError < StandardError 

    def initialize(error_code, error_info) 
    @code, @info = error_code, error_info 
    end 

    def message 
    "<Code: #{@code}> <Info: #{@info}>" 
    end 

end