Ruby的异常错误类

34
您可以创建一个异常的子类来使其更加描述性,但是您该如何设置默认的“message”?
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

第一个应该输出 "A custom message"

第二个应该输出 "You've triggered a MyError"

有没有关于最佳实践的建议?

2个回答

65

定义一个初始化方法,该方法以默认值为参数接受消息。然后使用该消息调用StandardError的初始化方法(使用super)。

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

32
只需要使用 super。如果不带参数列表调用 super,它将简单地传递所有参数,这就是为什么当你真正想要传递 没有 参数时,必须显式调用 super() 的原因。 - Jörg W Mittag
@JörgWMittag 为什么所有自定义错误类都继承自 StandardError?这背后有什么原因吗? - Arup Rakshit
因为它是安全的。每当从错误中进行救援时,应该使用StandardError(或更低级别),因为更高级别的错误,如Exception,甚至会在按下CTL-C等键时抛出。有关更多信息,请参见http://rails-bestpractices.com/posts/2012/11/01/don-t-rescue-exception-rescue-standarderror - Sean
@Sean 谢谢你提供的链接。 - Arup Rakshit

3

您也可以在您的子类中覆盖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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接