In meiner Anwendung führe ich meinen Code über PMD aus. Es zeigt mir diese Meldung:
- Vermeiden Sie printStackTrace (); Verwenden Sie stattdessen einen Logger-Aufruf.
Was bedeutet das?
In meiner Anwendung führe ich meinen Code über PMD aus. Es zeigt mir diese Meldung:
- Vermeiden Sie printStackTrace (); Verwenden Sie stattdessen einen Logger-Aufruf.
Was bedeutet das?
Antworten:
Es bedeutet, dass Sie ein Protokollierungsframework wie verwenden sollten Wieder anmelden oder log4j und anstatt Ausnahmen direkt zu drucken:
e.printStackTrace();
Sie sollten sie mit der API dieses Frameworks protokollieren:
log.error("Ops!", e);
Protokollierungsframeworks bieten Ihnen viel Flexibilität. Sie können beispielsweise auswählen, ob Sie sich bei einer Konsole oder einer Datei anmelden möchten, oder einige Nachrichten überspringen, wenn Sie feststellen, dass sie in einer bestimmten Umgebung nicht mehr relevant sind.
Wenn Sie printStackTrace()
eine Ausnahme aufrufen, wird in die Ablaufverfolgung geschrieben System.err
und es ist schwierig, sie an eine andere Stelle weiterzuleiten (oder zu filtern). Stattdessen wird empfohlen, ein Protokollierungsframework (oder einen Wrapper für mehrere Protokollierungsframeworks wie Apache Commons Logging) zu verwenden und die Ausnahme mithilfe dieses Frameworks zu protokollieren (z logger.error("some exception message", e)
. B. ).
Auf diese Weise können Sie:
Ein Produktionsqualitätsprogramm sollte eine der vielen Protokollierungsalternativen (z. B. log4j, logback, java.util.logging) verwenden, um Fehler und andere Diagnosen zu melden. Dies hat eine Reihe von Vorteilen:
Wenn Sie dagegen nur printStackTrace verwenden, hat der Bereitsteller / Endbenutzer nur wenig oder gar keine Kontrolle, und Protokollierungsnachrichten können unter unangemessenen Umständen entweder verloren gehen oder dem Endbenutzer angezeigt werden. (Und nichts erschreckt einen schüchternen Benutzer mehr als eine zufällige Stapelverfolgung.)
Fast jedes Protokollierungsframework bietet eine Methode, mit der wir das Throwable-Objekt zusammen mit einer Nachricht übergeben können. Mögen:
public trace(Marker marker, String msg, Throwable t);
Sie drucken die Stapelspur des Wurfobjekts.
Sprechen wir über das Unternehmenskonzept. Log bietet Ihnen flexible Ebenen (siehe Unterschied zwischen logger.info und logger.debug ). Unterschiedliche Personen möchten unterschiedliche Ebenen sehen, z. B. QAs, Entwickler und Geschäftsleute. Aber e.printStackTrace () druckt alles aus. Wenn diese Methode aufgerufen wird, wird derselbe Fehler möglicherweise mehrmals gedruckt. Dann sind die Devops- oder Tech-Ops-Mitarbeiter in Ihrem Unternehmen möglicherweise verrückt, weil sie dieselben Fehlererinnerungen erhalten. Ich denke, ein besserer Ersatz könnte sein. log.error("errors happend in XXX", e)
Dies druckt auch ganze Informationen aus, die leicht zu lesen sind als e.printStackTrace ()
Der Hauptgrund ist, dass Proguard Protokollaufrufe aus der Produktion entfernen würde. Denn durch Protokollieren oder Drucken von StackTrace ist es möglich, sie (Informationen im Stack-Trace oder im Protokoll) im Android-Telefon anzuzeigen, beispielsweise durch die Anwendung Logcat Reader. Damit es eine schlechte Praxis für die Sicherheit ist. Außerdem greifen wir während der Produktion nicht auf sie zu. Es ist besser, sie aus der Produktion zu entfernen. Da ProGuard alle Log-Aufrufe entfernt, die nicht stackTrace sind, ist es besser, Log-in-Catch-Blöcke zu verwenden und sie von Proguard aus der Produktion entfernen zu lassen.