捕获警告消息

时间:2012-10-06 17:18:19

标签: ruby warnings ruby-1.9.3

有没有办法捕获警告,例如救援异常?我不想简单地禁用警告(通过执行$VERBOSE = nil),但希望在运行时捕获警告消息的内容。

3 个答案:

答案 0 :(得分:2)

您可以将stderr重定向到StringIO对象以捕获字符串中的警告输出:

require 'stringio'

old_stderr = $stderr
$stderr = StringIO.new
Foo = 1
Foo = 2 # generates a warning
puts $stderr.string # prints the warning
$stderr = old_stderr

答案 1 :(得分:2)

require 'stringio'

def capture_stderr
  old, $stderr = $stderr, StringIO.new
  result = yield
  [result, $stderr.string]
ensure
  $stderr = old
end

答案 2 :(得分:1)

这有点难看,因为你将写入文件而你可能没有权限写入它们,它会将所有输出隐藏到$stderr,而不仅仅是警告,但它有效:

$stderr.reopen("errors.txt")
MyConst = 4
MyConst = 5   # generates a warning on the standard error output
$stderr.reopen("errors2.txt")
puts "The following errors happened:"
puts File.read("errors.txt")