Como em java adiciono um stacktrace à minha impressão de depuração
Pergunta
Qual é a maneira mais fácil de imprimir um stacktrace a partir de uma impressão de depuração?Freqüentemente, durante o teste, você gostaria de saber a pilha de chamadas que levou à situação que provocou uma mensagem de depuração.
Solução
Outras dicas
Se você estiver usando log4j
Exception e = new Exception();
log.error("error here", e);
imprimirá o stacktrace em seu log.
Se quiser salvar o rastreamento de pilha em uma String, você pode fazer isso;
String exception = "";
for (StackTraceElement element : e.getStackTrace())
exception += element.toString() + "\n";
Onde e é, obviamente, uma exceção.
Além disso, parece muito estranho gerar automaticamente uma exceção própria apenas para encontrar um rastreamento de pilha para uma depuração.Obtenha o Eclipse e use seu modo de depuração, é realmente incrível.
Apenas criar uma exceção arbitrária resolve para mim:
System.out.println("Oops, the bad thing happened");
new IllegalStateException().printStackTrace();
Assim como o @jjnguy disse, se você não tiver uma exceção, também pode chamar Thread.getStackTrace().
Você deve capturar a exceção em um bloco try-catch.
e.getStackTrace();
Isso retorna StackTraceElement[] que você pode interpretar.
Também:
e.printStackTrace()
irá ... imprimir o stacktrace.
Para simplesmente imprimir o rastreamento de pilha atual em stderr, você pode chamar:
Thread.dumpStack();
que por si só chama:
new Exception("Stack trace").printStackTrace();
Para saída para saída padrão em vez de stderr, passe System.out
para printStackTrace()
:
new Exception("Stack trace").printStackTrace(System.out);
Só porque eu mesmo precisava:
Como inspirado pela resposta Como encontro o chamador de um método usando stacktrace ou reflexão? , você pode recuperar a pilha de chamadas usando
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()
Em seguida, você processa e imprime/registra tudo o que lhe interessa.Mais trabalho do que usar Thread.dumpStack()
, mas mais flexível.