Ruby - 如何在救援后检查特定异常?

som*_*ser 6 ruby exception

在 Ruby 中,我想为特定的异常做一些特别的事情,但不足以进行特定的救援。在救援中检查特定异常的正确语法是什么?

示例(非工作)代码:

begin
   c = d
rescue => ex
  if ex == NameError
    puts 'NameError'
  else
    puts ex.message
  end
end
Run Code Online (Sandbox Code Playgroud)

For*_*er0 8

在您的示例中ex是一个on 异常实例,并且在将类本身与==运算符(它是一个Class对象)进行比较时不会给出预期的结果。您需要根据实际的类对象检查错误的类。

# A NameError or an error that is a subclass of NameError
ex.is_a?(NameError)
ex.kind_of?(NameError)

# NameError ONLY, not even sub-classes of NameError
ex.instance_of?(NameError)
Run Code Online (Sandbox Code Playgroud)

还有许多其他方法可以检查,尽管我概述的前面的方法是最常用的,通常是“首选”的方法。尽管仍然可以在类上使用等式,但它通常不是实现它的建议方法,因为它不太灵活,并且底层意图不太明确,上面的示例确切地表明您希望如何处理类的子类指定的错误。

ex.class == NameError
Run Code Online (Sandbox Code Playgroud)

我发现这个答案很好地解释了细微的差异。