2010-02-11 13 views
19

Ho una funzione generica che consente di stampare le eccezioni (utilizzando log4j):Come visualizzare la traccia dello stack su un'eccezione rilevata?

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause() + "\n" + e.getStackTrace().toString()); 
} 

Invece di vedere l'analisi dello stack che sto vedendo:

[Ljava.lang.StackTraceElement;@49af7e68 

Come posso vedere l'analisi dello stack dell'eccezione propriamente?

aggiornamento

log.error (e) < - mostra l'errore, ma non mostra pila traccia

+8

Chiamare 'log.error (e)' in log4j chiama la versione errata del metodo (http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Category.html#error% 28java.lang.Object% 29). Il JavaDoc per questo metodo menziona anche questo fatto: "AVVISO Nota che passare un Throwable a questo metodo stamperà il nome del Throwable ma nessuna traccia dello stack.Per stampare una traccia dello stack usa invece il modulo error (Object, Throwable)." –

+5

call log.error (e, e) farà il lavoro;) – Guillaume

risposta

12
+0

esattamente quello che mi serviva, grazie mille !!!!!!!!!!!!!!! – ufk

+4

Collegamento interrotto !!! ahhh si prega di inviare solo la risposta invece di fare riferimento ad altri siti. – codemonkey

+2

@codemonkey, puoi cercare te stesso per ExceptionUtils nel tuo motore di ricerca preferito: la mia risposta era usare una libreria esistente. Non riesco a mantenere tutti i collegamenti che ho pubblicato in SO. Ora, la risposta di Joachim suona meglio della mia :) Per favore leggila. – Guillaume

4

Throwable.getStackTrace restituisce un array di StackTraceElement s, quindi il metodo toString restituisce una rappresentazione testuale la matrice stessa.

Per recuperare effettivamente le informazioni di traccia stack, è necessario passare attraverso ogni StackTraceElement per ottenere ulteriori informazioni.

62

Il vostro quadro di registrazione dovrebbero avere la possibilità di accedere eccezioni, così semplicemente passando l'eccezione per il corretto .error(Object, Throwable) chiamata dovrebbe essere sufficiente:

I Se il tuo framework di registrazione non può farlo, o hai bisogno della traccia dello stack in un String per qualsiasi altro motivo, allora diventa un po 'più difficile. Dovrete creare un PrintWriter avvolgendo un StringWriter e chiamare .printStackTrace() sul Exception:

StringWriter sw = new StringWriter(); 
ex.printStackTrace(new PrintWriter(sw)); 
String stacktrace = sw.toString(); 
+0

quando passo l'eccezione a log.error, mostra solo il messaggio di errore senza traccia dello stack. using log4j – ufk

+1

Ciò significa che hai chiamato la versione sbagliata. C'è 'error (Object)' e 'error (Object, Throwable)'. Chiamare la prima versione chiamerà effettivamente 'toString()'. –

+2

-1 - log4j può farlo, ha appena invocato il metodo sbagliato. –

13

Hai provato?

private void _showErrorMessage(Exception e) { 
    log.error("Hey! got an exception", e); 
} 
+0

+1 per questa soluzione più semplice e pulita! – DerekY

4

Si potrebbe anche guardare le librerie di Guava da Google.

Throwables.getStackTraceAsString(Throwable throwable)

1

La risposta esatta alla tua domanda è che si dovrebbe chiamare Log4J come questo:

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause(), e); 
} 

Anche se avrei meno della chiamata a e.getCause() perché lo stacktrace darà che per voi in ogni caso, in modo da:

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage(), e); 
} 

ExceptionUtils va bene se si ha realmente bisogno di una stringa del stacktrace, ma dal momento che si sta utilizzando Log4J, è lo molto se non utilizza la sua gestione delle eccezioni.

1

Exception Stacktrace logging mostra due metodi per questo scopo, uno basato su Apache Commons e un altro che utilizza il metodo JDK standard.

Problemi correlati