2009-04-01 4 views
32

À des fins de diagnostic, j'ai parfois besoin de stocker la pile d'appels menant à une transition d'état donnée (par exemple, accorder un verrou, valider une transaction, etc.) plus tard je peux découvrir qui a déclenché à l'origine la transition d'état.Détermination de la pile d'appels actuelle (à des fins de diagnostic)

Actuellement, la seule façon dont je suis au courant de récupérer la pile d'appel ressemble à l'extrait de code suivant, que je considère comme terriblement laid:

StackTraceElement[] cause; 
try { 
    throw new Exception(); 
} catch (Exception e) { 
    cause = e.getStackTrace(); 
} 

Est-ce que quelqu'un sait d'une meilleure façon d'y parvenir?

Répondre

67

Je pense que vous pouvez obtenir la même chose avec:

StackTraceElement[] cause = Thread.currentThread().getStackTrace(); 
9

Eh bien, vous pouvez l'améliorer légèrement en ne lançant pas réellement l'exception.

Exception ex = new Exception(); 
ex.fillInStackTrace(); 
StackTraceElement[] cause = ex.getStackTrace(); 

En fait, je viens de vérifier: le constructeur appelle fillInStackTrace() déjà. Ainsi, vous pouvez simplifier à:

StackTraceElement[] cause = new Exception().getStackTrace(); 

Ceci est en fait ce que Thread.getStackTrace()-t si elle est appelée sur le thread courant, donc vous pouvez préférer l'utiliser à la place.

+0

Pas besoin de 'fillInStackTrace' (bien qu'il soit facile lire ses documents API à l'envers). –

2

Si vous voulez comme une chaîne et utiliser Apache Commons:

org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(new Throwable()) 
Questions connexes