[英]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.