Convertendo um rastreamento de pilha em uma string em Java
1. Introdução
Ao lidar com exceções em Java, frequentemente registramos ou simplesmente exibimos rastreamentos de pilha. No entanto, às vezes, não queremos apenas imprimir o rastreamento de pilha, podemos precisar gravar o rastreamento de pilha em um arquivo, em um banco de dados ou até mesmo transmiti-lo pela rede.
Para esses propósitos, ter o rastreamento de pilha comoString seria muito útil. E, infelizmente, Java não fornece um método muito conveniente para fazer isso diretamente.
2. Conversão com Core Java
Vamos começar com a biblioteca principal.
A funçãoprintStackTrace() da classeException pode ter um parâmetro, aPrintStream ouPrintWriter. Assim, é possível, usando umStringWriter, imprimir o rastreamento de pilha em umString:
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
Então, chamarsw.toString() retornará o rastreamento de pilha comoString.
3. Conversão com Commons-Lang
Embora o método anterior seja a maneira mais simples de converter um rastreamento de pilha emString usando o núcleo do Java, ele permanece um pouco complicado. Felizmente,Apache Commons-Lang fornece uma função para fazer o trabalho.
O Apache Commons-Lang é uma biblioteca muito útil que oferece muitos recursos ausentes nas classes principais da API Java, incluindo classes que podem ser usadas para trabalhar com as exceções.
Primeiro, vamos começar com a configuração do projeto. Ao usar o Maven, precisamos apenas adicionar a seguinte dependência aopom.xml:
org.apache.commons
commons-lang3
3.5
Então, em nosso caso, a classe mais interessante éExceptionUtils, que fornece funções para manipular as exceções. Usando esta classe, obter o rastreamento de pilha comoString de umException é bastante simples:
String stacktrace = ExceptionUtils.getStackTrace(e);
4. Conclusão
Obter o rastreamento de pilha de uma exceção comoString não é difícil, mas está longe de ser intuitivo. Este artigo apresenta duas maneiras de fazer isso, usando o Java principal ou o Apache Commons-Lang.
Lembre-se de que o Java 9 trará um novoStackWalking API que deve tornar as coisas mais fáceis.
Como sempre, as amostras de código podem ser encontradashere on GitHub.