【发布时间】:2019-01-11 17:27:24
【问题描述】:
在 Ruby 中,我想针对特定异常做一些特别的事情,但不足以进行特定的救援。在救援中检查特定异常的正确语法是什么?
示例(非工作)代码:
begin
c = d
rescue => ex
if ex == NameError
puts 'NameError'
else
puts ex.message
end
end
【问题讨论】:
在 Ruby 中,我想针对特定异常做一些特别的事情,但不足以进行特定的救援。在救援中检查特定异常的正确语法是什么?
示例(非工作)代码:
begin
c = d
rescue => ex
if ex == NameError
puts 'NameError'
else
puts ex.message
end
end
【问题讨论】:
在您的示例中,ex 是 on 异常的 instance,在使用 == 运算符(即 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)
还有许多其他方法可以检查,尽管我之前概述的方法是最常用的,并且通常是“首选”方法。尽管仍然可以在类上使用相等,但它通常不是实现它的建议方法,因为它不太灵活,并且对潜在意图不太清楚,上面的示例准确地表明了您希望如何处理指定错误。
ex.class == NameError
我发现this answer 很好地解释了细微的差异。
【讨论】:
我会使用多个救援块——一个只捕获NameError,另一个捕获所有错误类:
begin
c = d
rescue NameError => ex
puts 'NameError'
rescue => ex
puts ex.message
end
【讨论】: