作者:qiqianan | 来源:互联网 | 2022-12-10 13:58
在Ruby中,您可以使用捕获异常rescue => e
,而无需显式传递任何类型的异常,例如rescue CustomException => e
.
我可以告诉它不会捕获每个异常,因为:
def foo
foo
rescue => e
puts "It never reaches this block"
end
foo
这个无限循环永远不会被捕获,它会引发一个SystemStackError
.
rescue => e
捕获的是什么类型的异常?
1> Jörg W Mitta..:
如果没有指定异常过滤器,隐含的默认值是StandardError
(下降到默认的例外项目符号列表滚动,它列出了默认设置都rescue
和raise
).这也适用于尾随的"内联" rescue
修饰符,其语法根本不允许指定异常过滤器:
foo rescue bar
# always implicitly rescues StandardError
并非所有Exception
s都继承StandardError
,所以这不会拯救所有异常,但它会拯救所有可以明智获救的东西.不继承的异常StandardError
通常是那些非常严重或指向执行引擎内部问题的异常,用户代码无法以合理的方式从它们中恢复.例如,VM内部的内存不足错误或内部错误.
SystemStackError
是一个异常的例子,在用户代码中处理起来没有意义.如果堆栈耗尽,你就不能再进行任何方法调用,但是如果不进行方法调用,几乎不可能在Ruby 中做任何事情.另外,堆栈溢出通常是编程错误,您需要修复错误,而不是症状.
请注意,这种"全能"异常处理通常是不受欢迎的.您应该在异常规范中尽可能地缩小,甚至可以检查rescue
块中的异常对象,以确保您获得的异常是您想要处理的异常.非常广泛的捕获所有异常规范存在您将拯救您不知道如何处理的异常的风险.