有没有办法找出在执行某些代码期间是否引发和获救任何异常?
最好是用ActiveSupport::TestCase
而不是RSpec
是否有任何全局ruby异常堆栈或其他东西,我可以检查一下?
答案 0 :(得分:7)
如果你想成为一个怪物,你可以自己检测错误:
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
非常适合临时健全检查。生产代码很糟糕。
答案 1 :(得分:1)
正如评论中所阐明的那样,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