如何拯救ruby异常,而不是代码块中的故障
我想捕获PuppetError::Error异常,因此它不是致命的,但是PuppetError::ExecError应该是致命的 我的问题似乎是rescue子句正在捕获PuppetError::Error,然后将其提升到ExecError状态,因此调用代码不会捕获它。我需要把援救条款限制在一行,Open3。。线路。但是怎么做呢如何拯救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(
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
不清楚要执行的操作。您有一个方法定义和一段调用它的代码。对于每个部分,您希望挽救哪个错误类?不清楚您希望做什么。您有一个方法定义和一段调用它的代码。对于每个部分,您希望挽救哪个错误类?啊,太好了。我正在试着做一个测试,但看起来不错。谢谢。啊,太好了。我正在试着做一个测试,但看起来不错。谢谢