我有一个异常e
,我想将其转换为一个字符串,该字符串与未捕获异常时的标准ruby 输出完全相同。stderr
初始代码给了我错误的堆栈跟踪顺序,并且缩进不正确。
我不想编写自己的代码,而是希望看到一些“oneliner”。你怎么做到这一点?
我有一个异常e
,我想将其转换为一个字符串,该字符串与未捕获异常时的标准ruby 输出完全相同。stderr
初始代码给了我错误的堆栈跟踪顺序,并且缩进不正确。
我不想编写自己的代码,而是希望看到一些“oneliner”。你怎么做到这一点?
这将是相同的。
puts "#{$@.first}: #{$!.message} (#{$!.class})", $@.drop(1).map{|s| "\t#{s}"}
或者,使用e
:
puts "#{e.backtrace.first}: #{e.message} (#{e.class})", e.backtrace.drop(1).map{|s| "\t#{s}"}
如果您想记录为单个字符串,而不仅仅是输出,您可以这样做:
puts "#{e.backtrace.first}: #{e.message} (#{e.class})\n\t" + e.backtrace.join("\n\t")
我猜这在 Ruby 2 之前是不可能的,但现在这是核心中的一个函数:
e.full_message
如果您不想在输出中使用颜色代码:
e.full_message(highlight: false)
https://ruby-doc.org/core-2.5.1/Exception.html#method-i-full_message