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

时间:2018-08-03 19:33:29

标签: ruby exception

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

示例(无效)代码:

begin
   c = d
rescue => ex
  if ex == NameError
    puts 'NameError'
  else
    puts ex.message
  end
end

2 个答案:

答案 0 :(得分:4)

在您的示例中,ex是异常的实例,并且与==运算符(即{ {1}}对象。您需要对照实际的类对象检查错误的类。

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)

我发现this answer很好地解释了细微的差异。

答案 1 :(得分:1)

我将使用多个救援块-一个只能捕获NameError,另一个可以捕获所有错误类:

begin
  c = d
rescue NameError => ex
  puts 'NameError'
rescue => ex
  puts ex.message
end