2012-10-06 181 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