2012-03-24 10 views
0

Ich schreibe ein Programm, das aus verschiedenen Unterprogrammen besteht, von denen jedes ihre eigenen Fehler protokolliert. Am Ende der Ausführung möchte ich alle Fehler, die aufgetreten sind, auf den Bildschirm ablegen, der von dem Programm markiert wurde, das sie protokolliert hat.

Idealerweise würde ich so etwas wie dieses:

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) 

Aber wenn ich mein Programm die $ stdout Linien und die $ stderr Linien Verwechslungen laufen. Ich weiß, dass $ stdout Puffer und $ stderr nicht der Fall, so fügte ich diese Zeile in der Methode, die die Ausgabe druckt:

$stdout.sync = $stderr.sync = true 

, die ich gesagt haben, sollten die beiden Ausgangsströme synchronisieren. Aber leider bekomme ich immer noch eine durcheinandergewürfelte Ausgabe. Ich habe auch versucht, $stdout.flush nach jeder Zeile, die ich an $ stdout gesendet werden wollte, hinzugefügt, aber das scheint auch keinen Effekt zu haben. Hier

ist der Code, ich verwende:

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 

Jede Hilfe würde geschätzt.

Antwort

1

Ein möglicher Ansatz: dies die Fehlerausgabe in ein String mit so etwas wie sammeln:

require 'stringio' 

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

# run your program 

Und dann entweder $stderr wiederherstellen oder druckt nur die Zeichenfolge $stdout ...

puts $stderr.string 
+0

Da die '\ n' das 'puts' fügt als separater Schreibvorgang ein, wahrscheinlich möchten Sie ein' \ n' zum 'StringIO' ausgeben und' print' anstelle von 'puts' verwenden. – smparkes