一些背景:我在一个大的代码库(Rails)中有一些Ruby代码,在特定条件下引发异常。然而,例外情况不像预期的那样“发生”,它被无声地丢弃。我认为其他一些代码(宝石)可能会意外地拯救这个异常。如何确定在Ruby中正在救援的异常?
如何确定哪里有异常正在救援?
我完全可以控制这个异常。所以也许有一种例外的方法可以知道什么时候被救出?
人为的例子:
# code outside my control
def foo
yield
rescue
end
def black_box(&block)
foo(&block)
end
# my code
black_box do
puts 'about to raise'
raise
puts 'never gets here'
end
输出:
about to raise
所以异常被救出。我如何识别(从“我的代码”中)它在foo
中被救出?
你可以假设外国的宝石有异常情况_something_,而不是默默地跳过它。尝试将断点放到'#message','#cause'等并检查意外中断。幸运的话,你会在堆栈顶部获得调用者。 – mudasobwa
@mudasobwa确实,工作!在验收测试中,由于'config.action_dispatch.show_exceptions = false',Rails本身解救了这个异常。 – Stefan
很酷。 Rails做了太多的魔术,这就是为什么我更喜欢COBOL :) – mudasobwa