2011-08-18 10 views
52

यह शायद एक नौसिखिया प्रश्न है, लेकिन उम्मीद है कि आप मेरी मदद कर सकते हैं। :) मैं कुछ इस तरह है:जावा में e.printStackTrace() का उपयोग

try 
{ 
//try to do something there 
} 
catch (IOException e) 
{ 
//handle the exception 
e.printStackTrace(); 
} 

मैं NetBeans आईडीई उपयोग कर रहा हूँ और किसी कारण से printStackTrace कोई तरंगित लाइन में रेखांकित किया गया है। जब मैं Alt + Enter दबाता हूं, तो यह कहता है कि Throwable.printStackTrace() को हटाया जाना चाहिए। इसका क्या मतलब है? क्या कोई इस बात का अधिक अंतर्दृष्टि दे सकता है कि इसका क्या अर्थ हो सकता है? या क्या मैं इसे अनदेखा कर सकता हूं?

धन्यवाद!

उत्तर

20

यह सिर्फ एक सिफारिश है। ग्रहण में यह ठीक है - मेरा मानना ​​है कि यह केवल आईडीई आपको बता रहा है कि ऐसा करने के कई पारंपरिक तरीके हैं, जैसे कि कुछ अन्य उत्तरों। मुझे लगता है कि यह डिबगिंग के लिए उपयोगी है, और इन लॉगों को इकट्ठा करने के लिए डीबग मोड (कंसोल स्विच-डी जैसे) का उपयोग करने के लिए आपको घातक त्रुटि होने पर उपयोगकर्ताओं को बताना चाहिए।

+0

एक ऐसी बेहतर विधि है। – svarog

36

प्रयास करें:

e.printStackTrace(System.out); 
+0

आह, धन्यवाद @Pablo काम किया! पागल, यह चेतावनी क्यों ठीक से गायब हो जाता है? यदि आप पैरामीटर के रूप में 'System.out' निर्दिष्ट नहीं करते हैं और इसे खाली छोड़ देते हैं, तो क्या JVM इसे' डीबग-मोड कमांड मानता है और केवल कंसोल पर आउटपुट करता है? –

+6

हैक! यह वास्तव में समस्या को हल नहीं करता है जितना कि यह नेटबींस को दिखाता है। यह अभी भी डिफ़ॉल्ट त्रुटि स्ट्रीम में आउटपुट होगा। – ThePerson

+0

@ThePerson 'System.err' डिफ़ॉल्ट त्रुटि स्ट्रीम पर प्रिंट करेगा, न कि 'System.out'। 'System.out' डिफ़ॉल्ट आउटपुट स्ट्रीम का प्रतिनिधित्व करता है। – cst1992

14

यह शायद इसलिए है क्योंकि printStackTrace() वास्तव में जितना त्रुटि को संभाल नहीं है, क्योंकि यह सिर्फ कंसोल में ढेर उदासीनता है। यह प्लेसहोल्डर के रूप में कार्य करता है जब तक कि आप इसे उचित त्रुटि हैंडलिंग (यदि इसकी आवश्यकता हो) के साथ प्रतिस्थापित करें और आउटपुट को किसी प्रकार के लॉगर से प्रतिस्थापित करें।

9

e.printStackTrace();

अच्छा अभ्यास नहीं है क्योंकि यह डिफ़ॉल्ट त्रुटिस्ट्रीम में प्रिंट करता है, जो कि अधिकांश बार कंसोल है!

नेटबीन आपको इसके बारे में चेतावनी देना चाहिए। इसके बारे में अच्छी प्रैक्टिस, संदेश लॉगिंग कर रही है। एक ही संदर्भ का पालन करें:

http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html

संपादित अधिक जानकारी के लिए bellow पहली टिप्पणी देखें।

+6

नहीं, यह डिफ़ॉल्ट त्रुटि स्ट्रीम में प्रिंट करता है, जो एक अलग स्ट्रीम है, उपनाम फ़ाइलडिस्क्रिप्टर है, और इसे एक अलग फ़ाइल में पाइप किया जा सकता है: 'जावा YourClass 1> file.out 2> file.err' - e.printStackTrace प्रिंट' file.err ',' file.out 'नहीं। –

+2

हमेशा एक अच्छा अभ्यास नहीं है। यह कंसोल एक वेब सर्वर में एक कंसोल हो सकता है जहां आप एक्सेस नहीं कर सकते। कभी-कभी यह बेहतर होता है कि इस स्टैक ट्रेस को एप्लिकेशन के वर्तमान लॉग में भी विशेष रूप से वेब अनुप्रयोगों में डंप किया जाए। लॉग 4j जैसे लॉगिंग फ्रेमवर्क का उपयोग करके –

1

बस एक स्टैक ट्रेस प्रिंट करना पर्याप्त नहीं है। अपवाद के स्टैक ट्रेस को स्वयं प्रिंट करना इसका मतलब यह नहीं है कि यह पूरी तरह से खराब अभ्यास है, लेकिन अपवाद होने पर केवल स्टैक ट्रेस प्रिंट करना एक मुद्दा है।

हमेशा अपवाद लॉग करें (एक अच्छा logging framework का उपयोग करके), लेकिन उन्हें अंतिम उपयोगकर्ता को बेनकाब न करें। और यह सुनिश्चित रखें कि केवल विकास मोड में स्टैक निशान दिखाएं।

मैं स्वयं (अधिकांश समय) logger.log(Level.SEVERE, <exception>.getMessage(), <exception>); का उपयोग करता हूं।

जब NetBeans, अपवाद 'Surround Statement with try-catch' को संभालने के लिए अगर आप इस पर क्लिक करें आप सुझाव है, यह उत्पन्न होगा):

try { 
    //something need to be handle(exception that throw) 
} catch (SQLException ex) { 
    Logger.getLogger(ClassName.class.getName()).log(Level.SEVERE, null, ex); 
} 

कौन सा ex.printStackTrace(); से बेहतर है।

ये मदद मिल सकती है:

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