我需要将调试信息添加到块中发生的所有异常,但我不想搞乱回溯。$!
似乎不允许在1.9.3中使用它;无论我尝试什么,raise
正在取代回溯。
想法?
以下是我最初使用的内容:
def self.load(filename, virtual_path = nil)
t = Template.new(filename, virtual_path)
t.is_page? ? Page.new(t) : t
rescue
raise $!, "Error loading template '#{filename}'#{virtual_path ? " under virtual path '" + virtual_path + "'" : ""}: #{$!}"
end
到目前为止我发现的最好的是:
def self.load(filename, virtual_path = nil)
t = Template.new(filename, virtual_path)
t.is_page? ? Page.new(t) : t
rescue => e
raise e, "Error loading template '#{filename}'#{virtual_path ? " under virtual path '" + virtual_path + "'" : ""}: #{e.message} #{e.backtrace}"
end
这会将原始堆栈跟踪转储到消息中,但仍然不会将旧堆栈跟踪保留为堆栈跟踪
答案 0 :(得分:3)
如果查看Kernel#raise方法,可能需要三个参数:
raise(exception [, string [, array]])
如果要保留回溯,则应指定array
参数,这是回调信息。
示例:强>
说你原来有:
def some_method()
raise('original message')
end
some_method
#=> scratch.rb:10:in `some_method': original message (RuntimeError)
# from scratch.rb:16:in `<main>'
您可以使用异常的第三个参数来引发包含更新消息和相同回溯的新异常:
def some_method()
begin
raise('error message')
rescue
raise $!, 'new message', $!.backtrace
end
end
some_method
#=> scratch.rb:10:in `some_method': new message (RuntimeError)
# from scratch.rb:16:in `<main>'
如您所见,新异常与原始异常相同,但更新消息除外。