捕获警告消息(Capturing warning messages)

2019-09-23 15:26发布

有没有一种方法来捕捉警告,像抢救例外? 我不想简单地禁用警告(做$VERBOSE = nil ),但是想要捕捉的警告信息在运行时的内容。

Answer 1:

您可以重定向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


Answer 2:

require 'stringio'

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


Answer 3:

这是有点难看,因为你会被写入文件,你可能没有权限对其进行写操作,它会隐藏所有输出到$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")


文章来源: Capturing warning messages