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