¿Hay alguna forma de Throwable.printStackTrace(PrintStream s)
imprimir el seguimiento de la pila completa, de modo que pueda ver más allá de la línea final de "... 40 more"
?
¿Hay alguna forma de Throwable.printStackTrace(PrintStream s)
imprimir el seguimiento de la pila completa, de modo que pueda ver más allá de la línea final de "... 40 more"
?
Respuestas:
No es necesario; esa información está presente en otra parte del seguimiento de la pila. De los documentos de printStackTrace()
:
Tenga en cuenta la presencia de líneas que contienen los caracteres
"..."
. Estas líneas indican que el resto del seguimiento de la pila para esta excepción coincide con el número indicado de tramas desde la parte inferior del seguimiento de la pila de la excepción que fue causada por esta excepción (la excepción "adjunta").Esta abreviatura puede reducir en gran medida la longitud de la salida en el caso común en el que se lanza una excepción ajustada desde el mismo método que se detecta la "excepción causal".
En otras palabras, el "... x more"
único aparece en una excepción encadenada, y solo cuando las últimas x
líneas del seguimiento de la pila ya están presentes como parte del seguimiento de la pila de otra excepción encadenada.
Supongamos que un método detecta la excepción Foo, la envuelve en la excepción Bar y lanza Bar. Entonces se acortará el seguimiento de la pila de Foo. Si por alguna razón desea el rastreo completo, todo lo que necesita hacer es tomar la última línea antes del ...
rastreo de pila de Foo y buscarlo en el rastreo de pila de Bar; todo lo que está debajo de esa línea es exactamente lo que se habría impreso en el seguimiento de pila de Foo.
Tomemos el seguimiento de la pila de la documentación de Throwable.printStackTrace () :
HighLevelException: MidLevelException: LowLevelException
at Junk.a(Junk.java:13)
at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
at Junk.c(Junk.java:23)
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
... 1 more
Caused by: LowLevelException
at Junk.e(Junk.java:30)
at Junk.d(Junk.java:27)
at Junk.c(Junk.java:21)
... 3 more
Las causas se muestran desde la más anidada en la parte inferior (la "causa raíz") hasta la que pertenece el seguimiento de la pila impresa.
En este caso, la causa raíz es LowLevelException
, qué causó MidLevelException
, qué causó HighLevelException
.
Para obtener el seguimiento de pila completo, debe mirar los marcos de la excepción adjunta (y sus excepciones adjuntas):
Entonces, si quisiéramos obtener el seguimiento completo de la pila LowLevelException
, haríamos lo siguiente:
MidLevelException
)
MidLevelException
( HighLevelException
)Su seguimiento de pila completo se ve así:
LowLevelException
at Junk.e(Junk.java:30)
at Junk.d(Junk.java:27)
at Junk.c(Junk.java:21)
// From MidLevelException stack trace
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
// From HighLevelException stack trace
at Junk.main(Junk.java:4)
Notas al margen:
Puede haber casos en los que no se enumeran marcos, por ejemplo:
HighLevelException: MidLevelException
at Junk.main(Junk.java:4)
Caused by: MidLevelException
... 1 more
Esto puede ocurrir cuando la causa que crea en la misma línea: new HighLevelException(new MidLevelException())
. No se confunda con esto, el enfoque descrito anteriormente todavía funciona, simplemente no hay marcos para usar de la excepción, continúe con el que lo incluye.
En algunos casos, puede ahorrarse el conteo mirando el primer cuadro que no se omitió (la línea de arriba ... X more
). Si sabe qué métodos llaman al método en esa línea, puede buscar directamente las personas que llaman en los marcos de la excepción adjunta:
HighLevelException: MidLevelException: LowLevelException
at Junk.c(Junk.java:29)
at Junk.b(Junk.java:21)
at Junk.a(Junk.java:13)
at Junk.main(Junk.java:4)
Caused by: MidLevelException
// You know Junk.d is only called by Junk.b
at Junk.d(Junk.java:35)
... 3 more
...
es el primer cuadro que difiere. Sin embargo, al menos estará en la misma clase, lo que ayuda a encontrarlo.