gpt4 book ai didi

ruby - rescue => e 捕获什么类型的异常?

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:57 36 4
gpt4 key购买 nike

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

我可以看出它并没有捕获所有异常,因为:

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

foo

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

rescue => e 捕获什么类型的异常?

最佳答案

如果不指定异常过滤器,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 s 继承自 StandardError ,所以这不会挽救所有异常,但会挽救所有可以合理挽救的异常。不从 StandardError 继承的异常通常是如此严重的异常或指向执行引擎内部的问题,用户代码无法从中恢复方式。例如,内存不足错误或 VM 内部错误。

SystemStackError是在用户代码中处理没有实际意义的异常示例。如果堆栈耗尽,您将无法再进行任何方法调用,但是在 Ruby 中根本不进行任何方法调用几乎是不可能的。另外,堆栈溢出通常是编程错误,您需要修复错误,而不是症状。

请注意,这种“包罗万象”的异常处理通常是不受欢迎的。您的异常规范应该尽可能窄,甚至可以检查 rescue block 中的异常对象,以确保您得到的异常确实是您想要处理的异常。非常广泛的包罗万象的异常规范有可能挽救您不知道如何处理的异常。

关于ruby - rescue => e 捕获什么类型的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51379520/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com