java - stacktrace - stack trace traduccion
Determinación de la pila de llamadas actual(para fines de diagnóstico) (3)
Para fines de diagnóstico, a veces necesito almacenar la pila de llamadas que conducen a una transición de estado determinada (como otorgar un bloqueo, confirmar una transacción, etc.) para que cuando algo salga mal pueda averiguar quién activó originalmente la transición de estado.
Actualmente, la única forma que conozco para recuperar la pila de llamadas es como el siguiente fragmento de código, que considero terriblemente feo:
StackTraceElement[] cause;
try {
throw new Exception();
} catch (Exception e) {
cause = e.getStackTrace();
}
¿Alguien sabe de una mejor manera de lograr esto?
Bueno, puedes mejorarlo ligeramente al no lanzar la excepción.
Exception ex = new Exception();
ex.fillInStackTrace();
StackTraceElement[] cause = ex.getStackTrace();
En realidad, acabo de verificar: el constructor llama a fillInStackTrace()
ya. Entonces puedes simplificarlo para:
StackTraceElement[] cause = new Exception().getStackTrace();
Esto es realmente lo que hace Thread.getStackTrace()
si se llama en el hilo actual, por lo que puede preferir usarlo en su lugar.
Creo que puedes obtener lo mismo con:
StackTraceElement[] cause = Thread.currentThread().getStackTrace();
Si lo quiere como una Cadena y usa Apache Commons:
org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(new Throwable())