【问题标题】:Ruby - how to check for specific exception after rescue?Ruby - 如何在救援后检查特定异常?
【发布时间】:2019-01-11 17:27:24
【问题描述】:

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

示例(非工作)代码:

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

【问题讨论】:

    标签: ruby exception


    【解决方案1】:

    在您的示例中,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 很好地解释了细微的差异。

    【讨论】:

      【解决方案2】:

      我会使用多个救援块——一个只捕获NameError,另一个捕获所有错误类:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 2012-04-15
        • 1970-01-01
        • 2020-08-26
        • 2020-08-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多