确保块中出现的ruby错误隐藏了主块中的错误



我刚刚意识到下面的代码块只会引发'2',并隐藏引发'1'

2.3.8 :001 > begin
2.3.8 :002 >     raise '1'
2.3.8 :003?>   ensure
2.3.8 :004 >     raise '2'
2.3.8 :005?>   end
RuntimeError: 2

有没有办法也有加薪"1"的报告?

当您的程序被执行时,它遵循一条路径。当引发异常时,程序将中止,异常将重新出现。

通过使用rescue和/或ensure,您可以修改异常的处理方式,但始终只能出现一个异常。

但是ruby很有帮助,因为它在raise出现异常并且存在前一个异常时设置cause


def raise_an_exception
begin
raise "cause"
ensure
raise "effect"
end
end
begin
raise_an_exception
rescue => e
puts "'#{e.message}' was raised because '#{e.cause.message}'"
# => 'effect' was raised because 'cause'
end

这就是你要找的吗?请注意,cause也可以是nil

https://ruby-doc.org/core-2.7.0/Exception.html#method-i-cause

您告诉ruby始终将raise '2'放在ensure块中,无论之前做了什么(包括引发错误(。要生成raise '1'报告,您需要删除ensure块。

最新更新