在Ruby中,您可以使用捕获异常rescue => e
,而无需显式传递任何类型的异常,例如rescue CustomException => e
。
我可以说它不能捕获所有异常,因为:
def foo
foo
rescue => e
puts "It never reaches this block"
end
foo
这个无限循环永远不会被捕获,它会引发一个SystemStackError
。
rescue => e
捕获哪种类型的异常?
如果没有指定异常过滤器,隐含的默认值是StandardError
(向下滚动到默认的例外项目符号列表,它列出了默认设置都rescue
和raise
)。这也适用于尾随的“内联”rescue
修饰符,该修饰符的语法根本不允许指定异常过滤器:
foo rescue bar
# always implicitly rescues StandardError
并非所有都Exception
继承自StandardError
,因此这不会挽救所有异常,但会挽救所有可以合理挽救的异常。无法继承的异常StandardError
通常非常严重,或者指出执行引擎内部存在问题,以致用户代码无法以明智的方式从中恢复。例如,VM内存不足错误或内部错误。
SystemStackError
是一个异常示例,在用户代码中处理该异常实际上没有任何意义。如果堆栈已用完,则无法再进行任何方法调用,但是如果不进行方法调用,根本就不可能在Ruby中执行任何操作。另外,堆栈溢出通常是编程错误,您需要修复错误,而不是症状。
注意,通常不赞成这种“包罗万象”的异常处理。您应该在异常规范中尽量缩小范围,甚至检查rescue
块内的异常对象,以确保您得到的异常确实是您要处理的异常。非常广泛的包罗万象的异常规范会冒着您挽救不知道如何处理的异常的风险。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句