救援=> e捕获哪种类型的异常?

时间:2018-07-17 10:49:19

标签: ruby exception try-catch

在Ruby中,您可以使用rescue => e捕获异常,而无需显式传递任何类型的异常,例如rescue CustomException => e

我可以说它不能捕获所有异常,因为:

def foo
  foo
rescue => e
  puts "It never reaches this block"
end

foo

这个无限循环永远不会被捕获,它会引发一个SystemStackError

rescue => e捕获哪种类型的异常?

1 个答案:

答案 0 :(得分:7)

如果您未指定异常过滤器,请the implicit default is StandardError (scroll down to the bulleted list of default exceptions, it lists the defaults for both rescue and raise)。这也适用于尾随的“内联” rescue修饰符,该修饰符的语法根本不允许指定异常过滤器:

foo rescue bar
# always implicitly rescues StandardError

并非所有Exception都继承自StandardError,因此这不会挽救所有 异常,但会挽救所有可以合理挽救的异常。不继承自StandardError的异常通常是 so 严重的异常,或指出执行引擎内部的问题,即用户代码无法以明智的方式从它们中恢复。例如,VM内存不足错误或内部错误。

SystemStackError是一个异常的示例,该异常在用户代码中实际上没有任何意义。如果堆栈已用完,则无法再进行任何方法调用,但是如果不进行方法调用,几乎就不可能在Ruby 中执行任何操作。另外,堆栈溢出通常是编程错误,您需要修复错误,而不是症状。

请注意,通常不赞成这种“包罗万象”的异常处理。在异常规范中,您应该尽可能地狭窄,甚至可以检查rescue块内的异常对象,以确保您得到的异常确实是您要处理的异常。范围非常广泛的所有异常规范都有可能会挽救您不知道如何处理的异常。