Was ist falsch mit dem System.err in Java?
Ich bin mit dem Enerjy (http://www.enerjy.com/) statische code-analyzer-tool auf meinem Java-code. Es sagt mir, dass die folgende Zeile:
System.err.println("Ignoriert, dass die Datenbank");
ist schlecht, weil es System.err. Der genaue Fehler ist: "JAVA0267 Nutzung des Systems.err"
Was ist falsch mit der Verwendung des System.err?
InformationsquelleAutor user128807 | 2009-06-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort: Es ist als eine schlechte Praxis ist die Verwendung für logging-Zwecke.
Es ist eine Beobachtung, dass in den alten Zeiten, als dort, wo keine allgemein verfügbaren/akzeptiert, logging-frameworks, jeder verwendet System.err zu drucken Fehlermeldungen und Stacktraces an die Konsole. Dieser Ansatz ist möglicherweise geeignet, bei der Entwicklung und lokalen Test-phase, ist aber nicht geeignet für eine Produktionsumgebung, weil Sie vielleicht verlieren wichtige Fehlermeldungen. Weil dies in fast allen tools zur statischen Analyse, die heute diese Art von code wird erkannt und gekennzeichnet als schlechte Praxis (oder einen ähnlich benannten problem).
Logging-frameworks wiederum den strukturierten und logischen Art und Weise zu protokollieren Ihre Ereignisse und Fehlermeldungen, die Sie speichern können, wird die Nachricht in verschiedene persistente Speicherorte (log Datei, log, db, etc.).
Den meisten offensichtlich (und frei von externen Abhängigkeiten)
hackLösung ist die Verwendung des eingebauten Java-Logging-framework über diejava.util.logging.Logger
Klasse, als die er leitet die Protokollierung von Ereignissen auf der Konsole standardmäßig aktiviert. Zum Beispiel:(oder Sie könnten nur schalten Sie die option analysis)
Zusätzlich System.err sind nicht die Informationen, wo die Nachricht kam. Sie hängt somit davon ab, auf menschliche Leser zu bestimmen, was getan werden sollte, wenn überhaupt.
Sie könnte Locker wichtige Fehlermeldungen" Warum? Gibt es nicht auf der Konsole? Was bin ich?
Was meinst du mit "(oder Sie könnten nur schalten Sie die option analysis)"?
Geek hat eine berechtigte Frage... Warum tun Sie sagen, dass wir verlieren wichtige Fehlermeldungen mit
System.err
?InformationsquelleAutor
den Deskriptor der Fehler ist:
Scheint es, dass Sie mit System.err für logging-Zwecke, das ist nicht optimal aus mehreren Gründen:
InformationsquelleAutor
Während ich Stimme mit den oben genannten Punkte, über die Verwendung eines logging-framework, habe ich noch eher auf
System.err
Ausgang an einem Ort: Im shut-down-Haken. Das ist, weil ich entdeckt, dass bei Verwendung derjava.util.logging
Rahmen log-Anweisungen werden nicht immer angezeigt, wenn Sie auftreten, im shut-down-Haken. Dies ist, weil die logging-Bibliothek vermutlich enthält einen eigenen shutdown-hook zu bereinigen, log-Dateien und andere Ressourcen, und Sie können nicht Sie verlassen sich auf die Reihenfolge, in der die shutdown-hooks ausgeführt werden, verlassen Sie sich nicht aufjava.util.logging
Aussagen wie erwartet funktioniert.Schauen Sie sich diesen link (der Abschnitt "Kommentare") für weitere Informationen über diese.
http://weblogs.java.net/blog/dwalend/archive/2004/05/shutdown_hooks_2.html
(Natürlich die andere alternative ist zu verwenden ein anderes logging framework.)
InformationsquelleAutor
System.irren ist wirklich mehr für debugging-Zwecke als alles andere. Richtige Ausnahmebehandlung und Umgang mit Fehlern in einer Weise, die mehr Benutzer-freundlich ist bevorzugt. Wenn der Benutzer gedacht, um den Fehler anzuzeigen, verwenden Sie ein System.aus.println statt.
Wenn Sie möchten, um zu verfolgen solcher Fehler von einem Entwickler-Standpunkt aus, sollten Sie einen logger zu verwenden.
InformationsquelleAutor
Dinge geschrieben System.err sind in der Regel verloren, zur Laufzeit, so ist es als eine bessere Praxis zu verwenden, ein logging-framework, das mehr Flexibilität darüber, wo, um die Ausgabe der Nachricht, so kann es als Datei gespeichert und analysiert.
System.err und System.für nicht-Konsolen-Anwendungen ist immer nur gesehen, indem der Entwickler die Ausführung des Codes in seine oder Ihre IDE und nützliche Informationen verloren, wenn das Element ausgelöst wird, in der Produktion.
weil die Konsole geht Weg, wenn die app geschlossen wird, oder ist das nur nie sichtbar in den ersten Platz.
InformationsquelleAutor
System.err.println und System.aus.println sollten nicht verwendet werden, da loggging-Schnittstelle. STD-Output und Standard-Error (diese aber sind geschrieben, die von System.heraus und .err) sind für Nachrichten aus der command-line-tools.
InformationsquelleAutor
System.err-prints auf der Konsole. Dies kann geeignet sein für einen Schüler testen Ihre Hausaufgaben, aber ungeeignet für eine Anwendung, wo diese Nachrichten werden nicht gesehen (nur die Konsole zu speichern, so viele Linien).
Ein besserer Ansatz wäre eine exception werfen, halten Sie die Nachricht würde normalerweise an die Konsole gesendet. Eine alternative dazu wäre die Verwendung von third-party-logging-software, die speichert diese Nachrichten in einer Datei gespeichert werden kann, für immer.
InformationsquelleAutor