Cómo imprimir números de línea en el registro. Digamos que al enviar alguna información al registro, también quiero imprimir el número de línea donde está esa salida en el código fuente. Como podemos ver en el seguimiento de la pila, muestra el número de línea donde se produjo la excepción. El seguimiento de pila está disponible en el objeto de excepción.
Otra alternativa podría ser la inclusión manual del número de línea al imprimir en el registro. ¿Hay alguna otra manera?
Respuestas:
De Angsuman Chakraborty :fuente
Terminamos usando una clase personalizada como esta para nuestro trabajo con Android:
fuente
getStackTrace()[3]
lugar degetStackTrace()[2]
Manera rápida y sucia:
Con algunos detalles más:
Eso generará algo como esto:
fuente
System.out.println("i am here: " + new Exception().getStackTrace()[0]);
me da todos los detalles que necesito :)Me veo obligado a responder al no responder a su pregunta. Supongo que está buscando el número de línea únicamente para admitir la depuración. Hay mejores formas Hay formas difíciles de obtener la línea actual. Todo lo que he visto son lentos. Es mejor usar un marco de registro como ese en java.util.logging package o log4j . Con estos paquetes, puede configurar su información de registro para incluir el contexto hasta el nombre de la clase. Luego, cada mensaje de registro sería lo suficientemente único como para saber de dónde vino. Como resultado, su código tendrá una variable 'logger' a la que llama a través de
en vez de
fuente
Log4J le permite incluir el número de línea como parte de su patrón de salida. Consulte http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html para obtener detalles sobre cómo hacer esto (el elemento clave en el patrón de conversión es "L"). Sin embargo, el Javadoc incluye lo siguiente:
fuente
El código publicado por @ simon.buchan funcionará ...
Pero si lo llama en un método, siempre devolverá el número de línea de la línea en el método, así que use el fragmento de código en línea.
fuente
Recomendaría usar un kit de herramientas de registro como log4j . El registro se puede configurar a través de archivos de propiedades en tiempo de ejecución, y puede activar / desactivar funciones como el número de línea / registro de nombre de archivo.
Mirar el javadoc para PatternLayout te da la lista completa de opciones: lo que buscas es% L.
fuente
Utilizo este pequeño método que genera el rastreo y el número de línea del método que lo llamó.
¡Haga doble clic en la salida para ir a esa línea de código fuente!
Es posible que deba ajustar el valor del nivel dependiendo de dónde coloque su código.
fuente
Util
viene esto ?No puede garantizar la coherencia del número de línea con el código, especialmente si está compilado para su lanzamiento. De todos modos, no recomendaría usar números de línea para ese propósito, sería mejor dar una carga útil del lugar donde se produjo la excepción (el método trivial es configurar el mensaje para incluir los detalles de la llamada al método).
Es posible que desee ver el enriquecimiento de excepciones como una técnica para mejorar el manejo de excepciones http://tutorials.jenkov.com/java-exception-handling/exception-enrichment.html
fuente
Si se ha compilado para su lanzamiento, esto no es posible. Es posible que desee analizar algo como Log4J, que le dará automáticamente suficiente información para determinar de cerca dónde se produjo el código registrado.
fuente
primero el método general (en una clase de utilidad, en el código java1.4 simple, puede que tenga que reescribirlo para java1.5 y más)
Luego, el método de utilidad específico para obtener el stackElement correcto:
fuente
Aquí está el registrador que usamos.
se envuelve alrededor de Android Logger y muestra el nombre de la clase, el nombre del método y el número de línea.
http://www.hautelooktech.com/2011/08/15/android-logging/
fuente
Mira este enlace . En ese método, puede saltar a su código de línea, cuando hace doble clic en la fila de LogCat.
También puede usar este código para obtener el número de línea:
fuente
fuente
Todos estos le brindan los números de línea de su hilo y método actual que funcionan muy bien si usa un try catch donde espera una excepción. Pero si desea detectar cualquier excepción no controlada, está utilizando el controlador de excepción no capturado predeterminado y el subproceso actual devolverá el número de línea de la función de controlador, no el método de clase que arrojó la excepción. En lugar de usar Thread.currentThread () simplemente use el Throwable pasado por el controlador de excepciones:
En lo anterior, use e.getStackTrace () [0] en su función de controlador (fShowUncaughtMessage) para obtener el delincuente.
fuente
El siguiente código es el código probado para la línea de registro sin nombre de clase y nombre de método desde donde se llama al método de registro
fuente
El
stackLevel
depende de la profundidad se llama a este método. Puede probar de 0 a un gran número para ver qué diferencia.Si
stackLevel
es legal, obtendrá una cadena comojava.lang.Thread.getStackTrace(Thread.java:1536)
fuente
Esta es exactamente la característica que implementé en esta lib XDDLib . (Pero es para Android)
Un clic en el texto subrayado para navegar hacia donde está el comando de registro
Eso
StackTraceElement
está determinado por el primer elemento fuera de esta biblioteca. Por lo tanto, en cualquier lugar fuera de esta lib será legal, incluyendolambda expression
,static initialization block
, etc.fuente
A mi manera me funciona
fuente
puede usar -> Reporter.log ("");
fuente