在引发异常时如何获取整个错误堆栈?

时间:2011-11-16 17:41:36

标签: ruby-on-rails ruby

我有以下代码,用于在遇到错误时显示应用状态的报告。

begin
    ... # makes calls to lower level instances
rescue
    send_report
end

def send_report
  str = ""
  str.concat("#{$!}\n\r")
  str.concat("Report ----------\n\r")
  ...
  raise str
end

问题是$!只给我一行错误,没有任何通常的堆栈跟踪。示例错误是:

DEBUG - undefined method `to_sym' for nil:NilClass

这显示没有文件名或行号或任何上下文。如何添加?

1 个答案:

答案 0 :(得分:7)

你可以指定存储异常的变量(尽管你确实将它们存储在$!中,我更喜欢显式的非全局变量)。

begin 
  # exception is raised
rescue Exception => e
  str = "#{e.message}\n"
  str << e.backtrace.join("\n")
  raise str
end

您只得到错误的原因是被插值的异常可能会在Exception对象上调用to_sreturns its message and not its backtrace.