我刚刚意识到下面的代码块只会引发'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
块。