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 
Como pego o conteúdo de printStackTrace()?
4 Respostas
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!
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…
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!
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{
...
}
catch (Exception erro){
StackTraceElement stack[] = erro.getStackTrace();
String stackTrace = "";
for (int i = 0; i < stack.length; i++){
stackTrace += stack[i].toString() + "\n";
}
...
}
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(String args[]){
System.err = new PrintStream(new FileOutputStream("meuArquivo.log"), true);
...
}
dai antes de finalizar o aplicativo vc chama System.err.close()
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( Exception e ) {
StackTraceElement [] element = e.getStackTrace();
String s = e.getClass().toString();
// imprime a classe da exception sem o "class "
System.out.println( "\n" + s.substring( 6, s.length() ) );
for ( int i = 0; i < element.length; i++ ) {
System.out.println(
" at " +
element[i].getClassName() +
"." +
element[i].getMethodName() +
"(" +
element[i].getFileName() +
":" +
element[i].getLineNumber() +
")"
);
}
}