如何测试是否有异常被拯救?

How to test whether any exception was rescued?

有没有办法找出在某些代码的执行过程中是否引发并挽救了异常?

最好在用 ActiveSupport::TestCase 而不是 RSpec

编写的测试中

是否有任何全局 ruby 异常堆栈或其他东西,我可以检查一下?

如果你想成为怪物,你可以自己检测错误:

class StandardError
  @@called = false

  def initialize
    @@called = true
    super
  end

  def self.called
    @@called
  end
end

#test it out like so:

def raise_arg_error
  raise ArgumentError
rescue
end

puts ArgumentError.called #false
raise_arg_error
puts ArgumentError.called #true

非常适合临时完整性检查。生产代码很糟糕。

如评论中所述,OP 需要它用于调试目的,而不是用它编写测试。


Kernel#set_trace_func 让您拦截低级事件,例如引发错误:

set_trace_func(proc do |event, *_|
  puts 'Raised!' if event == 'raise'
end)

raise 'Oh, no!' rescue :foo

您可以 运行 #set_trace_func 在您尝试调试的代码之前。如果没有抛出异常,但钩子记录了加注 - 有人救了它。


这可能会产生一些噪音,具体取决于您正在执行的操作。幸运的是,您可以按文件和行过滤它:

set_trace_func(proc do |event, file, line, *_|
  if event == 'raise' && file == 'test.rb' && line == 42
    puts "Raised on #{file}:#{line}!"
  end
end)

它甚至为您提供了绑定,因此您可以下拉调试器:

require 'irb'

set_trace_func(proc do |event, *_, error_binding, _|
  error_binding.irb if event == 'raise'
end)

def foo
  bar = 42
  raise 'Oh, no!' rescue :baz
end

foo

# Opens an irb
# > bar # => 42