Qual é a maneira mais fácil de converter o resultado Throwable.getStackTrace()
em uma sequência que representa o rastreamento de pilha?
java
stack-trace
tostring
ripper234
fonte
fonte
Respostas:
Pode-se usar o seguinte método para converter um
Exception
rastreamento de pilha emString
. Esta classe está disponível no Apache commons-lang, que é a biblioteca dependente mais comum com muitos fontes abertas popularesorg.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)
fonte
org.apache.commons.lang3.exception.ExceptionUtils
.Use
Throwable.printStackTrace(PrintWriter pw)
para enviar o rastreamento de pilha para um gravador apropriado.fonte
StringWriter
ePrintWriter
?Isso deve funcionar:
fonte
printStackTrace
deve apenas retornar a string, deixando a decisão de imprimí-la ou não para o usuário :) #printXXX()
deve imprimir XXX.Se você está desenvolvendo para Android, uma maneira muito mais fácil é usar isso:
O formato é o mesmo que getStacktrace, por exemplo
fonte
Log.e("TAG", "My message", new Throwable());
Throwables
Classe da goiabaSe você possui a
Throwable
instância real , o Google Guava forneceThrowables.getStackTraceAsString()
.Exemplo:
fonte
AVISO: Não inclui a causa (que geralmente é a parte útil!)
fonte
String.format("%n")
ou algo semelhante em vez de"\n"
fazer os lamers do DOS felizes.Para mim, a maneira mais limpa e fácil era:
fonte
fonte
StringWriter
ePrintWriter
devem serclose
d .... (ou acho que apenas asPrintWriter
necessidades precisam ser fechadas, pois o fechamento deve fecharStringWriter
também)O código a seguir permite obter o stackTrace inteiro com um
String
formato, sem usar APIs como log4J ou mesmojava.util.Logger
:fonte
Aqui está uma versão que pode ser copiada diretamente no código:
Ou, em um bloco de captura
fonte
Throwable
é definido, certo?É a maneira mais fácil de converter o resultado em String? Estou usando isso no meu programa para imprimir o rastreamento de pilha
fonte
Imprima o rastreamento de pilha em a
PrintStream
e converta-o emString
:fonte
Rastreio da pilha de impressão em sequência
É útil quando você deseja imprimir o rastreamento atual da pilha de encadeamentos sem criar uma instância de
Throwable
- mas observe que criar novosThrowable
e obter rastreamento de empilhamento a partir daí é realmente mais rápido e mais barato do que chamarThread.getStackTrace
.fonte
Kotlin
Estender a classe Throwable fornecerá a propriedade String
error.stackTraceString
:fonte
fonte
O sniping inteligente no primeiro conjunto de comentários foi muito divertido, mas realmente depende do que você está tentando fazer. Se você ainda não possui a biblioteca correta, três linhas de código (como na resposta de D. Wroblewski) são perfeitas. OTOH, se você já possui a biblioteca apache.commons (como a maioria dos grandes projetos), a resposta de Amar é mais curta. OK, você pode levar dez minutos para obter a biblioteca e instalá-la corretamente (menos de um, se você souber o que está fazendo). Mas o tempo está passando, então você pode não ter tempo de sobra. Jarek Przygódzki tinha uma ressalva interessante - "Se você não precisa de exceções aninhadas".
Mas e se eu não precisar dos rastreamentos de pilha completos, aninhados e tudo? Nesse caso, o segredo é usar o getFullStackTrace do apache.common (consulte http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html # getFullStackTrace% 28java.lang.Throwable% 29 )
Isso salvou meu bacon. Obrigado, Amar, pela dica!
fonte
Código do Apache Commons Lang 3.4 ( JavaDoc ):
A diferença com as outras respostas é que ela usa
autoFlush
noPrintWriter
.fonte
Sem
java.io.*
isso pode ser feito assim.E então a
trace
variável mantém seu rastreamento de pilha. A saída também mantém a causa inicial, a saída é idêntica àprintStackTrace()
Exemplo,
printStackTrace()
produz:A
trace
String mantém, quando impressa emstdout
fonte
Versão Scala
fonte
se você estiver usando o Java 8, tente isso
você pode encontrar o código para a
getStackTrace()
função fornecida porThrowable.java
:e
StackTraceElement
, para isso, fornecetoString()
como:Então, junte-se ao
StackTraceElement
"\ n".fonte
uma exapansão na resposta de Gala que também incluirá as causas da exceção:
fonte
A solução é converter o stackTrace da matriz em tipo de dados string . Veja o seguinte exemplo:
fonte
Com a Java 8 Stream API, você pode fazer algo assim:
Ele pegará uma matriz de elementos de rastreio de pilha, os converterá em sequência e ingressará em sequência multilinha.
fonte
Meu oneliner para converter o rastreamento de pilha na sequência de várias linhas incluída:
Fácil de passar para o logger "como está".
fonte
printStackTrace()
daqui. Você perderá: 1) Exceção que foi lançada; 2) Causas e seu rastreamento de pilhaprintStackTrace()
nunca fazia parte da questão.Se você não quiser usar uma biblioteca externa e não estiver desenvolvendo para o Android , poderá criar um método de 'extensão' como este:
fonte
Pergunta antiga, mas gostaria de adicionar um caso especial em que você não deseja imprimir toda a pilha , removendo algumas partes nas quais não está realmente interessado, excluindo determinadas classes ou pacotes.
Em vez de
PrintWriter
usar umSelectivePrintWriter
:Onde a
SelectivePrintWriter
classe é dada por:Observe que esta classe pode ser facilmente adaptada para filtrar por Regex
contains
ou outros critérios. Observe também que depende dosThrowable
detalhes da implementação (provavelmente não será alterado, mas ainda).fonte
Quando você executa o programa, a saída será algo semelhante:
fonte
Eu me pergunto por que ninguém mencionou
ExceptionUtils.getStackFrames(exception)
Para mim, é a maneira mais conveniente de despejar o rastreamento de pilha com todas as suas causas até o fim:
fonte
Aviso: Este tópico pode ser um pouco estranho, mas tudo bem ...;)
Não sei qual era o motivo original dos pôsteres para querer que o rastreamento da pilha fosse string em primeiro lugar. Quando o rastreamento da pilha deve terminar em um SLF4J / Logback LOG, mas nenhuma exceção foi ou deve ser lançada, eis o que eu faço:
Gosto porque não requer uma biblioteca externa (exceto o seu back-end de log, que estará disponível na maioria das vezes, é claro).
fonte
Poucas opções
StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString();
Usando o Google Guava lib
String stackTrace = Throwables.getStackTraceAsString ( myException ) ;
org.apache.commons.lang.exception.ExceptionUtils.getStackTrace (Throwable)
fonte