有没有办法捕获警告,比如救援异常?我不想简单地禁用警告(通过做$VERBOSE = nil),而是想在运行时捕获警告消息的内容。
			
			1202 次
		
3 回答
            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
    于 2012-10-07T08:22:10.920   回答
    
    
            2        
        
		
require 'stringio'
def capture_stderr
  old, $stderr = $stderr, StringIO.new
  result = yield
  [result, $stderr.string]
ensure
  $stderr = old
end
    于 2015-10-05T05:14:11.957   回答
    
    
            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")
    于 2012-10-06T17:28:52.153   回答