【发布时间】:2017-06-29 09:16:18
【问题描述】:
一些背景知识:我在大型代码库 (Rails) 中有一些 Ruby 代码,在某些情况下会引发异常。然而,异常并没有像预期的那样“发生”,它被默默地丢弃。我假设其他一些代码(gem)挽救了异常,可能是偶然的。
我怎样才能确定在哪里该异常被挽救了?
我确实可以完全控制异常。那么也许有办法让异常知道何时或何时获救?
人为的例子:
# 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 中获救的?
【问题讨论】:
-
您可以假设外国 gem 做了 something 例外,而不仅仅是默默地跳过它。尝试在
#message、#cause等处设置断点并检查是否有意外中断。如果幸运的话,您会在堆栈顶部获得调用方。 -
@mudasobwa 确实有效!由于在验收测试中
config.action_dispatch.show_exceptions = false,Rails 自己挽救了异常。 -
酷。 Rails 太神奇了,这就是为什么我更喜欢 COBOL :)
标签: ruby-on-rails ruby exception