So drucken Sie Zeilennummern in das Protokoll. Wenn Sie beispielsweise einige Informationen in das Protokoll ausgeben, möchte ich auch die Zeilennummer drucken, in der sich diese Ausgabe im Quellcode befindet. Wie wir im Stack-Trace sehen können, wird die Zeilennummer angezeigt, in der die Ausnahme aufgetreten ist. Für das Ausnahmeobjekt ist eine Stapelverfolgung verfügbar.
Eine andere Alternative könnte das manuelle Einfügen der Zeilennummer beim Drucken in das Protokoll sein. Gibt es einen anderen Weg?
Antworten:
Von Angsuman Chakraborty :quelle
Am Ende haben wir eine benutzerdefinierte Klasse wie diese für unsere Android-Arbeit verwendet:
quelle
getStackTrace()[3]
statt seingetStackTrace()[2]
Schneller und schmutziger Weg:
Mit einigen weiteren Details:
Das wird ungefähr so ausgeben:
quelle
System.out.println("i am here: " + new Exception().getStackTrace()[0]);
gibt mir alle Details, die ich brauche :)Ich bin gezwungen zu antworten, indem ich Ihre Frage nicht beantworte. Ich gehe davon aus, dass Sie die Zeilennummer nur zur Unterstützung des Debuggens suchen. Es gibt bessere Wege. Es gibt hackige Möglichkeiten, um die aktuelle Zeile zu erhalten. Ich habe nur langsam gesehen. Sie sind besser dran, wenn Sie ein Protokollierungsframework wie das in java.util.logging-Paket oder log4j verwenden . Mit diesen Paketen können Sie Ihre Protokollierungsinformationen so konfigurieren, dass sie den Kontext bis zum Klassennamen enthalten. Dann wäre jede Protokollnachricht eindeutig genug, um zu wissen, woher sie stammt. Infolgedessen enthält Ihr Code eine 'Logger'-Variable, über die Sie aufrufen
anstatt
quelle
Mit Log4J können Sie die Zeilennummer als Teil des Ausgabemusters einschließen. Weitere Informationen hierzu finden Sie unter http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html (das Schlüsselelement im Konvertierungsmuster ist "L"). Der Javadoc enthält jedoch Folgendes:
quelle
Der von @ simon.buchan gepostete Code funktioniert ...
Wenn Sie es jedoch in einer Methode aufrufen, wird immer die Zeilennummer der Zeile in der Methode zurückgegeben. Verwenden Sie daher lieber das Code-Snippet inline.
quelle
Ich würde empfehlen, ein Protokollierungs-Toolkit wie log4j zu verwenden . Die Protokollierung kann zur Laufzeit über Eigenschaftendateien konfiguriert werden, und Sie können Funktionen wie die Protokollierung von Zeilennummer / Dateiname aktivieren / deaktivieren.
Wenn Sie sich das Javadoc für das PatternLayout ansehen, erhalten Sie die vollständige Liste der Optionen - was Sie suchen, ist% L.
quelle
Ich benutze diese kleine Methode, die den Trace und die Zeilennummer der Methode ausgibt, die sie aufgerufen hat.
Doppelklicken Sie auf die Ausgabe, um zu dieser Quellcodezeile zu gelangen!
Möglicherweise müssen Sie den Pegelwert anpassen, je nachdem, wo Sie Ihren Code ablegen.
quelle
Util
?Sie können die Konsistenz der Zeilennummern mit dem Code nicht garantieren, insbesondere wenn er für die Freigabe kompiliert wurde. Ich würde sowieso nicht empfehlen, Zeilennummern für diesen Zweck zu verwenden. Es wäre besser, eine Nutzlast des Ortes anzugeben, an dem die Ausnahme ausgelöst wurde (die triviale Methode besteht darin, die Nachricht so einzustellen, dass sie die Details des Methodenaufrufs enthält).
Vielleicht möchten Sie die Anreicherung von Ausnahmen als eine Technik zur Verbesserung der Ausnahmebehandlung betrachten. Http://tutorials.jenkov.com/java-exception-handling/exception-enrichment.html
quelle
Wenn es für die Veröffentlichung kompiliert wurde, ist dies nicht möglich. Vielleicht möchten Sie sich etwas wie Log4J ansehen, das Ihnen automatisch genügend Informationen liefert, um ziemlich genau zu bestimmen, wo der protokollierte Code aufgetreten ist.
quelle
Zuerst die allgemeine Methode (in einer Utility-Klasse, in einfachem alten Java1.4-Code, müssen Sie sie möglicherweise für Java1.5 und mehr neu schreiben).
Dann die spezifische Dienstprogrammmethode, um das richtige stackElement zu erhalten:
quelle
Hier ist der Logger, den wir verwenden.
Es wird um Android Logger gewickelt und zeigt den Klassennamen, den Methodennamen und die Zeilennummer an.
http://www.hautelooktech.com/2011/08/15/android-logging/
quelle
Schauen Sie sich diesen Link an . Bei dieser Methode können Sie zu Ihrem Zeilencode springen, wenn Sie auf die Zeile von LogCat doppelklicken.
Sie können diesen Code auch verwenden, um die Zeilennummer abzurufen:
quelle
quelle
Mit diesen Informationen erhalten Sie die Zeilennummern Ihres aktuellen Threads und Ihrer aktuellen Methode, die hervorragend funktionieren, wenn Sie einen Try-Catch verwenden, bei dem Sie eine Ausnahme erwarten. Wenn Sie jedoch eine nicht behandelte Ausnahme abfangen möchten, verwenden Sie den Standardhandler für nicht erfasste Ausnahmen, und der aktuelle Thread gibt die Zeilennummer der Handlerfunktion zurück, nicht die Klassenmethode, die die Ausnahme ausgelöst hat. Anstatt Thread.currentThread () zu verwenden, verwenden Sie einfach das vom Ausnahmebehandler übergebene Throwable:
Verwenden Sie oben e.getStackTrace () [0] in Ihrer Handlerfunktion (fShowUncaughtMessage), um den Täter zu ermitteln.
quelle
Der folgende Code enthält den getesteten Code für die Protokollierungszeile, keinen Klassennamen und Methodennamen, von dem aus die Protokollierungsmethode aufgerufen wird
quelle
Das
stackLevel
hängt von der Tiefe ab, die Sie diese Methode nennen. Sie können von 0 bis zu einer großen Zahl versuchen, um festzustellen, welcher Unterschied besteht.Wenn
stackLevel
es legal ist, erhalten Sie einen String wiejava.lang.Thread.getStackTrace(Thread.java:1536)
quelle
Dies ist genau die Funktion, die ich in dieser lib XDDLib implementiert habe . (Aber es ist für Android)
Klicken Sie mit einem Klick auf den unterstrichenen Text , um zu der Stelle zu navigieren, an der sich der Protokollbefehl befindet
Das
StackTraceElement
wird durch das erste Element außerhalb dieser Bibliothek bestimmt. So wird überall außerhalb dieser lib legal sein, einschließlichlambda expression
,static initialization block
usw.quelle
So wie es bei mir funktioniert
quelle
Sie können -> Reporter.log ("") verwenden;
quelle