2012-03-24 28 views
0

それぞれ独自のエラーを記録するさまざまなサブプログラムで構成されたプログラムを作成しています。実行の終わりに、遭遇したすべてのエラーを、ログに記録されたプログラムによってラベル付けされた画面にダンプしたいと思います。

理想的には私はこのようなものだろう:

Encountered 4 errors during compilation (STDOUT) 
    Tokenizer Errors: (STDOUT) 
     Line 4: Invalid symbol found '@' (STDERR) 

    Parser Errors: (STDOUT) 
     Line 7: expected 'end' but saw 'while' (STDERR) 
     Line 7: expected ';' but saw 'while' (STDERR) 
     Line 12 expected '.' but saw 'end' (STDERR) 

をしかし、私は私のプログラムを実行すると$の標準出力ラインと$ stderrのラインアップ混入されています。私は$の標準出力バッファと$ stderrにはないことを知っているので、私は、出力プリントする方法に次の行を追加:

$stdout.sync = $stderr.sync = true 

私は2つの出力ストリームを同期する必要があると言われています。しかし、残念ながら私はまだ混乱した出力を受けます。また、$ stdoutに送信したいすべての行の後に$stdout.flushを追加しようとしましたが、それも効果がないようです。任意の助けをいただければ幸いです

def self.dump() 
    $stdout.sync = $stderr.sync = true # attempted sync 
    if not @@lexer_error_log.empty? or not @@parser_error_log.empty? 
     puts "Encountered #{@@err_cnt} errors during compilation\n" 
     $stdout.flush #flush 
    end 

    if not @@lexer_error_log.empty? 
     puts "\nTokenizer Errors:" 
     $stdout.flush # flush 
     @@lexer_error_log.each {|e| $stderr.puts "\t#{e}\n" } 
    end 

    if not @@parser_error_log.empty? 
     puts "Parser Errors:" 
     $stdout.flush # flush 
     @@parser_error_log.each {|e| $stderr.puts "\t#{e}\n" } 
    end 
    end 

:ここ

は、私が使用していたコードです。

答えて

1

一つの可能​​なアプローチ:このようなものでStringにエラー出力を収集:

require 'stringio' 

so = $stderr 
$stderr = StringIO.new('', 'w') 

# run your program 

そして$stderrを復元するか、単に$stdoutに文字列を印刷するのいずれか...以来

puts $stderr.string 
+0

'puts'の追加が別の書き込みとして行われる' \ n'の場合、 'StringIO'に' \ n'を出力し、 'puts'ではなく' print'を使いたいと思うでしょう。 – smparkes

関連する問題