簡體   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