2012-10-06 49 views
1

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

回答

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

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

是否可以重定向到一些Ruby的内部IO而不是外部文件? – sawa

2
require 'stringio' 

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