【问题标题】:What type of exception does rescue => e captures?rescue => e 捕获什么类型的异常?
【发布时间】:2018-07-17 10:49:19
【问题描述】:

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

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

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

foo

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

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

【问题讨论】:

  • rescue => e,为什么是“e”?
  • @TPR e 是存储异常实例的变量的名称。它可以是任何其他名称。

标签: ruby exception try-catch


【解决方案1】:

如果您不指定异常过滤器,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

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

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

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

【讨论】:

  • rescue => e,为什么是“e”?
  • 您必须询问编写代码的人。
  • 对不起,因为我看的课本也写了“e”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多