【问题标题】:Ruby: Prepend info to exception messages without touching stacktraceRuby:在不触及堆栈跟踪的情况下为异常消息添加信息
【发布时间】:2013-03-13 11:27:59
【问题描述】:

我需要为块内发生的所有异常添加调试信息,但我不想弄乱回溯。$! 在 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

这会将原始堆栈跟踪转储到消息中,但仍不会将旧堆栈跟踪保留为堆栈跟踪

【问题讨论】:

  • 无论您尝试过什么,都在您的描述中发布,这反过来又有助于我们向您推荐更好的东西。
  • 我已经用示例更新了问题

标签: ruby exception-handling


【解决方案1】:

如果你看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>'

如您所见,新异常与原始异常相同,只是更新了消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2022-08-23
    相关资源
    最近更新 更多