2010-10-24 20 views
8

मेरा एक कार्यक्रम में मैं सभी अपवादों को पकड़ना चाहता हूं और उन्हें स्पष्ट रूप से प्रिंट करना चाहता हूं (अंततः अपवादों को देखते हुए आगे बढ़ने में सक्षम होने के लिए)।इसे मुद्रित करने के लिए स्कैला में अपवाद के स्टैक ट्रेस कैसे प्राप्त करें?

तो मैं इस की कोशिश की है:

 

try { 
    ... 
} 
catch { 
    case ex : Exception => { 
    println ("\n" + ex) 
    println ("\n" + ex.getStackTrace + "\n") 
    } 
} 
finally { 
    ... 
} 
 

लेकिन इस (getStackTrace का प्रयोग करके) अपने आप का कारण बनता है "java.lang.OutOfMemoryError: PermGen अंतरिक्ष"। मैं क्या गलत कर रहा हूं? मुझे यकीन है कि यह प्राप्त करने से पहले मेरे पास बहुत सारी मुफ्त JVM हीप मेमोरी है (जैसा कि मैंने प्रोग्राम की शुरुआत में अपवाद पैदा करने का प्रयास किया है)।

+0

अपवाद किस तरह 'try' में फेंक दिया गया था ब्लॉक? –

+0

@ लार्समैन, यह एक अवैध अर्ग्यूमेंट अपवाद है और मैंने इसे अपने आप से फेंक दिया। – Ivan

+0

क्या आप स्कैला 2.7.एक्स या स्कैला 2.8.x का उपयोग करते हैं? – soc

उत्तर

2

लगता है जैसे आपको अधिक permgen space आवंटित करने की आवश्यकता है। जावा में आप एक JVM तर्क के साथ ऐसा करते हैं:

JAVA_OPTS="-XX:MaxPermGen=256m" 
+0

मुझे लगता है कि यह सही जवाब नहीं है। क्योंकि मेरे पास यह पैरामीटर अनलर्टेड है (यह डिफ़ॉल्ट रूप से 256 मीटर है, AFAIK) और अपवाद फेंकने से पहले बहुत कम स्मृति का उपयोग करें। समस्या तब होती है जब मैं Exception.getStackTrace तक पहुंचने का प्रयास करता हूं। – Ivan

+0

क्या आपने इसे कुछ बड़ा करने की कोशिश की है? यह निश्चित रूप से फिश लगता है कि एक स्टैक ट्रेस प्राप्त करना आपके परमजन स्पेस को थका रहा है, लेकिन हो सकता है कि अगर आप उस बिंदु पर मेमोरी बढ़ा सकते हैं जहां आप वास्तव में स्टैक ट्रेस की जांच कर सकते हैं तो आप क्या हो रहा है में कुछ अंतर्दृष्टि प्राप्त करने में सक्षम होंगे। –

+0

यदि मुझे अपवाद नहीं मिलता है, तो (स्टैक ट्रेस समेत) सही ढंग से मुद्रित होता है और दृश्य दिखता है। लेकिन यह - "हो सकता है कि आप उस बिंदु पर स्मृति को बढ़ा सकें जहां आप वास्तव में स्टैक ट्रेस की जांच कर सकते हैं, आप क्या हो रहा है में कुछ अंतर्दृष्टि प्राप्त करने में सक्षम होंगे" - तर्कसंगत लगता है, विचार के लिए धन्यवाद। – Ivan

5

मुझे लगता है कि जब आप एकदम सही, स्टैंडअलोन काम करने के बाद करना चाहिए:

-XX:MaxPermGen=256m 

आप JVM args सेट कर सकते हैं एक वातावरण चर सेट करके स्काला द्वारा प्रयोग की जाने

scala> def foo(f :() => Unit) : Unit = try { 
    | f() 
    | } catch { case e : Exception => println("H" + e.getStackTrace) } 
foo: (f:() => Unit)Unit 

scala> foo(() => throw new NullPointerException) 
H[Ljava.lang.StackTraceElement;@30a4effe 

मुझे आश्चर्य है कि क्या आप एक अपवाद जो अपनी ही ०१२३८१९९१५ है: इस बात का उदाहरण है क्योंकि यह मेरे 2.8.0 (यानी दर्शाती है सब पर कोई स्मृति समस्याओं) का उपयोग कर के लिए काम करता? इसके विपरीत यह मामला है कि अपने कार्यक्रम स्मृति (32Mb is the default on a client-class machine by the way) पर बहुत कम चल रहा है हो सकता है और आप एक बहुत गहरी ढेर है (स्केला-भूमि में असामान्य नहीं!)

संबंधित मुद्दे