【问题标题】:Rescue NameError but not NoMethodError救援 NameError 但不是 NoMethodError
【发布时间】:2016-08-13 09:14:28
【问题描述】:

我需要在特殊情况下捕获 NameError。但我不想捕获 NameError 的所有子类。有没有办法做到这一点?

# This shall be catched
begin
  String::NotExistend.new
rescue NameError
  puts 'Will do something with this error'
end

# This shall not be catched
begin
  # Will raise a NoMethodError but I don't want this Error to be catched
  String.myattribute = 'value'
rescue NameError
  puts 'Should never be called'
end

【问题讨论】:

    标签: ruby nameerror nomethoderror rescue


    【解决方案1】:

    你也可以用更传统的方式来做

    begin
      # your code goes here
    rescue NoMethodError
      raise
    rescue NameError
      puts 'Will do something with this error'
    end
    

    【讨论】:

    • 它只适用于NoMethodError,而不适用于现在或将来的其他子类。
    【解决方案2】:

    如果它的类与给定的不同,您可以重新引发异常:

    begin
      # your code goes here
    rescue NameError => exception
      # note that `exception.kind_of?` will not work as expected here
      raise unless exception.class.eql?(NameError)
    
      # handle `NameError` exception here
    end
    

    【讨论】:

    • 这个解决方案符合我的需要。
    【解决方案3】:

    您还可以检查异常消息并决定要做什么。 这是使用您提供的代码的示例。

    # This shall be catched
    begin
      String::NotExistend.new
    rescue NameError => e 
      if e.message['String::NotExistend'] 
         puts 'Will do something with this error'
       else 
        raise
      end
    end
    
    # This shall not be catched
    begin
      # Will raise a NoMethodError but I don't want this Error to be catched
      String.myattribute = 'value'
      rescue NameError => e 
      if e.message['String::NotExistend'] 
         puts 'Should never be called'
      else
        raise
      end
    end
    

    【讨论】:

    • 如果有String::NotExistend2呢?最好检查异常的类,而不是 stackoverflow.com/a/38931436/1941418 中的回答
    • 我想这取决于你所有的“特殊”情况。我回答的重点是,您可以使用该消息过滤掉有关特定异常的非常具体的信息。如果只是检查课程涵盖了您所有的特殊情况而不是使用它,如果没有,您还有其他可用的选项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多