2015-10-06 75 views
0

我有一個使用ERB類來解析一些嵌入式Ruby的Ruby腳本。如果被解析的代碼重新定義了一個常量,那麼ERB會向STDERR發出一個警告,但是我的腳本完全不知道發生了這種情況。如何捕獲/控制關於已初始化常量的ERB警告?

  • 如何發現警告是否已發出?
  • 我可以強制它是一個錯誤嗎?
  • 我可以在進入STDERR並操作/重定向它之前獲取警告文本嗎?

    #!/usr/bin/env ruby 
    require "erb" 
    begin 
        erb = ERB.new("<% FOO = 1 %>\n<%FOO = 2 %>", 0, "-") 
        result = erb.result 
    rescue 
        fail # Doesn't cause exception 
    end 
    STDOUT.puts "OKAY" 
    

輸出是:

(erb):2: warning: already initialized constant FOO 
(erb):1: warning: previous definition of FOO was here 
OKAY 
+0

重定向很簡單。只要執行'$ stderr = StringIO.new'(或其他) –

+0

看起來像erb認爲這是一個警告,因此不會引發錯誤。即使捕獲stdout和stderr,如果您設置日誌記錄級別以避免生成警告,您也可能無法在生產環境中獲取任何內容。 –

回答

0

塞爾吉奧的小費給我做的能力,正是我想要的:

captured_err = StringIO.new 
old_stderr = $stderr 
$stderr = captured_err 
# Can generate warnings to $stderr 
result = erb.result 
$stderr = old_stderr 
captured_err.close 
if (captured_err.size != 0) then 
    STDERR.puts "** #####" 
    STDERR.puts "** ERROR: Ruby code resulted in warnings" 
    captured_err.string.each_line { |line| STDOUT.puts " " + line } 
    exit 1 
end 
相關問題