2010-08-01 82 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