Como pego o conteúdo de printStackTrace()?

4 respostas
M

alguém sabe como eu faço pra atirar o conteúdo do printStackTrace() de uma exception em um arquivo texto ao invéz do console? Não quero só o getMessage() ou o getCause()… também quero poder jogar no arquivo texto a pilha toda… Ou seja, a saída de um printStackTrace() todo :slight_smile:

4 Respostas

J

ueh?!
vou tentar alguma coisa aquiveja se funciona ai:

RandomAccessFile ra = new RandomAccessFile("meuFile.txt","rw");
ra.writeUTF(e.printStackTrace());

Será que rola!?

bom, num lembro se é writeUTF ou se tem um writeString mesmo…

bom, mas a idéia está dada!

Abraços!

J

Oi, o printStackTrace tem overloads para aceitar um PrintStream. Dá uma olhada nas docs de Throwable. Fora isso, se for uma exception sua, dava para sobreescrever o metodo.

<editado>Mas, se vc precisa mesmo do conteudo, é melhor usar o getStackTrace</editado>

valeuz…

F

“jujo”:
ueh?!
vou tentar alguma coisa aquiveja se funciona ai:

RandomAccessFile ra = new RandomAccessFile&#40;"meuFile.txt","rw"&#41;;
ra.writeUTF&#40;e.printStackTrace&#40;&#41;&#41;;

Será que rola!?

bom, num lembro se é writeUTF ou se tem um writeString mesmo…

bom, mas a idéia está dada!

Abraços!

o metodo printStackTrace() tem retorno void, o seu codigo nem compilaria…

mas agora o metodo getStackTrace(), retorna um array de StackTraceElement,

vc poderia fazer assim:

try&#123;
 ...
&#125;
catch &#40;Exception erro&#41;&#123;
 StackTraceElement stack&#91;&#93; = erro.getStackTrace&#40;&#41;;
 String stackTrace = "";
 for &#40;int i = 0; i &lt; stack.length; i++&#41;&#123;
  stackTrace += stack&#91;i&#93;.toString&#40;&#41; + "\n";
 &#125;
 ...
&#125;

mas no seu caso como vc quer simplesmente por o stackTrace em um arquivo, uma outra opcao interecante seria alterar o System.err, a variavel System.err eh um PrintStream, eh uma variavel estatica mas nao eh constante… entaum no inicio do seu programa vc altera e no final vc fecha…

public static void main&#40;String args&#91;&#93;&#41;&#123;
 System.err = new PrintStream&#40;new FileOutputStream&#40;"meuArquivo.log"&#41;, true&#41;;
 ...
&#125;

dai antes de finalizar o aplicativo vc chama System.err.close()

M

bem, eu não tinha visto as respostas de vcs... mas o felipe postou bem como eu fiz, no caso, pra deixar igualzinho a saída do stacktrace, eu fiz essa gambiarra ai ó ahuhuaehau, no exemplo, eu to imprimindo no console só:

public static void log&#40; Exception e &#41; &#123;

        StackTraceElement &#91;&#93; element = e.getStackTrace&#40;&#41;;

        String s = e.getClass&#40;&#41;.toString&#40;&#41;;

        // imprime a classe da exception sem o &quot;class &quot;
        System.out.println&#40; &quot;\n&quot; + s.substring&#40; 6, s.length&#40;&#41; &#41; &#41;;

        for &#40; int i = 0; i &lt; element.length; i++ &#41; &#123;

            System.out.println&#40;

                    &quot;	at &quot; +
                    element&#91;i&#93;.getClassName&#40;&#41; +
                    &quot;.&quot; +
                    element&#91;i&#93;.getMethodName&#40;&#41; +
                    &quot;&#40;&quot; +
                    element&#91;i&#93;.getFileName&#40;&#41; +
                    &quot;&#58;&quot; +
                    element&#91;i&#93;.getLineNumber&#40;&#41; +
                    &quot;&#41;&quot;
            &#41;;
        &#125;

    &#125;
Criado 20 de janeiro de 2005
Ultima resposta 21 de jan. de 2005
Respostas 4
Participantes 4