繁体   English   中英

如何挽救ruby异常,但不能在代码块中失败

[英]how rescue ruby exception, but not failure in code block

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

我的问题似乎是抢救子句捕获了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用于系统对人偶二进制文件的调用失败; PuppetError:ExecError用于Open3 :: popen3失败,因为它找不到人偶二进制文件。

您可以使用两个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子句rescue并提升为PuppetError::ExecError

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM