2009-04-01 22 views
32

नैदानिक ​​उद्देश्यों के लिए मुझे कभी-कभी कॉल स्टैक को स्टोर करने की आवश्यकता होती है जो किसी दिए गए राज्य संक्रमण (जैसे ताला देना, लेनदेन करना आदि) का कारण बनती है ताकि जब कुछ गलत हो बाद में मैं यह पता लगा सकता हूं कि मूल रूप से राज्य संक्रमण किसने ट्रिगर किया था।वर्तमान कॉल स्टैक (डायग्नोस्टिक प्रयोजनों के लिए) निर्धारित करना

वर्तमान में, एक ही रास्ता मैं के बारे में पता कर रहा हूँ कॉल स्टैक पुनः प्राप्त करने के निम्नलिखित कोड का टुकड़ा की तरह लग रहा है, जो मैं बहुत बदसूरत पर विचार करें:

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

किसी एक बेहतर तरीका पता है यह पूरा करने के?

उत्तर

67

मुझे लगता है कि आप के साथ एक ही बात प्राप्त कर सकते हैं:

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

ठीक है, आप वास्तव में अपवाद फेंकने से थोड़ा सुधार कर सकते हैं।

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

वास्तव में, मैं सिर्फ जाँच: निर्माता पहले से ही fillInStackTrace() कहता है। तो तुम यह करने के लिए आसान बनाने में कर सकते हैं:

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

यह वास्तव में अगर यह मौजूदा धागे पर कहा जाता है क्या Thread.getStackTrace() करता है, तो आप के बजाय इसे का उपयोग पसंद कर सकते हैं।

+0

'fillInStackTrace' के लिए कोई ज़रूरत नहीं है (हालांकि यह आसान है इसके एपीआई दस्तावेज़ पीछे की ओर पढ़ने के लिए)। –

2

आप एक स्ट्रिंग के रूप में यह चाहते हैं और अपाचे कॉमन्स का उपयोग करें:

org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(new Throwable()) 
संबंधित मुद्दे