如何拯救ruby异常,而不是代码块中的故障

如何拯救ruby异常,而不是代码块中的故障,ruby,exception-handling,Ruby,Exception Handling,我想捕获PuppetError::Error异常,因此它不是致命的,但是PuppetError::ExecError应该是致命的 我的问题似乎是rescue子句正在捕获PuppetError::Error,然后将其提升到ExecError状态,因此调用代码不会捕获它。我需要把援救条款限制在一行,Open3。。线路。但是怎么做呢 module PuppetCert def self.remove(instance_hostname) begin Open3::popen3(

我想捕获PuppetError::Error异常,因此它不是致命的,但是PuppetError::ExecError应该是致命的

我的问题似乎是rescue子句正在捕获PuppetError::Error,然后将其提升到ExecError状态,因此调用代码不会捕获它。我需要把援救条款限制在一行,Open3。。线路。但是怎么做呢

module PuppetCert
  def self.remove(instance_hostname)
    begin
      Open3::popen3("puppet cert clean #{instance_hostname}") do |stdin, stdout, stderr, wait_thr|
        if wait_thr.value.success?
          puts "success"
        else
          raise PuppetError::Error
          return
        end
      end
    rescue
      raise PuppetError::ExecError
    end
  end
end

instances.each do |i|
  begin
    PuppetCert.remove(i)
  rescue PuppetError::Error
    logger.error("PuppetCert.remove failed. Not fatal")
  end
end
提前谢谢


编辑:为了澄清,这两个PuppetError类型都是我创建的自定义类型(此处未显示),用于识别不同类型的故障。PuppetError::Error用于当系统对puppet二进制文件的调用失败时;PuppetError:ExecError用于Open3::popen3因找不到puppet二进制文件而失败的情况。

您可以使用两个
rescue
子句,一个用于捕获
PuppetError::Error
并再次引发,另一个用于捕获其他所有内容:

module PuppetCert
  def self.remove(instance_hostname)
    begin
      Open3::popen3("puppet cert clean #{instance_hostname}") do |stdin, stdout, stderr, wait_thr|
        if wait_thr.value.success?
          puts "success"
        else
          raise PuppetError::Error
          return
        end
      end
    rescue PuppetError::Error => error
      raise error
    rescue
      raise PuppetError::ExecError
    end
  end
end

第一个
rescue
子句(顺序很重要,因此必须先出现)将
PuppetError::Error
解救出来,并简单地再次引发它,也就是说,它只在进入更一般的
rescue
之前拦截它,因此它不会得到提升。第二个
rescue
子句将解救所有其他异常,并将其提升为
PuppetError::ExecError

您可以使用两个
rescue
子句,一个用于捕获
PuppetError::Error
并再次引发,另一个用于捕获其他所有异常:

module PuppetCert
  def self.remove(instance_hostname)
    begin
      Open3::popen3("puppet cert clean #{instance_hostname}") do |stdin, stdout, stderr, wait_thr|
        if wait_thr.value.success?
          puts "success"
        else
          raise PuppetError::Error
          return
        end
      end
    rescue PuppetError::Error => error
      raise error
    rescue
      raise PuppetError::ExecError
    end
  end
end

第一个
rescue
子句(顺序很重要,因此必须先出现)将
PuppetError::Error
解救出来,并简单地再次引发它,也就是说,它只在进入更一般的
rescue
之前拦截它,因此它不会得到提升。第二个
rescue
子句将解救所有其他异常,并将其升级为
PuppetError::ExecError

不清楚要执行的操作。您有一个方法定义和一段调用它的代码。对于每个部分,您希望挽救哪个错误类?不清楚您希望做什么。您有一个方法定义和一段调用它的代码。对于每个部分,您希望挽救哪个错误类?啊,太好了。我正在试着做一个测试,但看起来不错。谢谢。啊,太好了。我正在试着做一个测试,但看起来不错。谢谢