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.
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