2012-05-07 15 views
45

का उपयोग अपने आवेदन में, मैं PMD.It के माध्यम से अपने कोड चला रहा हूँ मुझे यह संदेश दिखाता है:प्रिंटस्टैकट्रेस से बचें(); एक लकड़हारा कॉल के बजाय

  • printStackTrace से बचें(); इसके बजाय एक लॉगर कॉल का उपयोग करें।

इसका क्या अर्थ है?

उत्तर

88

इसका मतलब है कि आप या की तरह प्रवेश ढांचे का उपयोग करना चाहिए और सीधे मुद्रण अपवाद के बजाय:

log.error("Ops!", e); 

लॉगिंग चौखटे आप दे:

e.printStackTrace(); 

आप उन्हें इस चौखटे 'एपीआई का उपयोग कर लॉग इन करना चाहिए बहुत लचीलापन, उदाहरण के लिए आप चुन सकते हैं कि आप कंसोल या फ़ाइल में लॉग इन करना चाहते हैं - या शायद कुछ संदेशों को छोड़ दें यदि आप उन्हें किसी पर्यावरण में अब प्रासंगिक नहीं पाते हैं।

31

यदि आप अपवाद पर printStackTrace() पर कॉल करते हैं तो ट्रेस System.err पर लिखा गया है और इसे कहीं और रूट करना मुश्किल है (या इसे फ़िल्टर करें)। ऐसा करने के बजाय आपको लॉगिंग फ्रेमवर्क (या कई लॉगिंग फ्रेमवर्क के आसपास एक रैपर, अपाचे कॉमन्स लॉगिंग जैसे) का उपयोग करने और उस ढांचे का उपयोग करके अपवाद लॉग करने की सलाह दी जाती है (उदा। logger.error("some exception message", e))।

  • एक बार में विभिन्न स्थानों, जैसे करने के लिए लॉग बयान लिखें:

    कि ऐसा करने की अनुमति देता कंसोल और एक फ़ाइल

  • गंभीरता (त्रुटि, चेतावनी, जानकारी, डीबग इत्यादि) द्वारा मूल विवरणों को फ़िल्टर करें और मूल (सामान्य रूप से पैकेज या कक्षा आधारित)
  • कोड को बदलने के बिना लॉग प्रारूप पर कुछ प्रभाव पड़ता है
  • आदि
+0

बस कहीं और मूल्यवान प्रतिक्रिया के लिए धन्यवाद कह रहा है ;-) – GhostCat

14

एक उत्पादन गुणवत्ता कार्यक्रम त्रुटियों और अन्य निदान रिपोर्ट करने के लिए कई लॉगिंग विकल्प में से एक (जैसे log4j, logback, java.util.logging) का उपयोग करना चाहिए। इसमें कई फायदे हैं:

  • लॉग संदेश कॉन्फ़िगर करने योग्य स्थान पर जाते हैं।
  • अंतिम उपयोगकर्ता तब तक संदेश नहीं देखता जब तक आप लॉगिंग कॉन्फ़िगर नहीं करते हैं ताकि वह करता है।
  • आप कितने छोटे या अधिक लॉगिंग दर्ज किए गए हैं, यह नियंत्रित करने के लिए आप विभिन्न लॉगर्स और लॉगिंग स्तर आदि का उपयोग कर सकते हैं।
  • लॉगिंग की तरह दिखने के लिए आप विभिन्न एपेंडर प्रारूपों का उपयोग कर सकते हैं।
  • आप आसानी से लॉगिंग आउटपुट को एक बड़ी निगरानी/लॉगिंग ढांचे में प्लग कर सकते हैं।
  • उपरोक्त सभी को अपना कोड बदलने के बिना किया जा सकता है; यानी तैनात अनुप्रयोग की लॉगिंग कॉन्फ़िगरेशन फ़ाइल को संपादित करके।

इसके विपरीत, अगर तुम सिर्फ printStackTrace उपयोग करते हैं, deployer/अंत उपयोगकर्ता थोड़ा यदि कोई नियंत्रण है, और प्रवेश संदेश खो या तो करने के लिए या अनुचित परिस्थितियों में अंत उपयोगकर्ता को दिखाया उत्तरदायी हैं।(और कुछ भी यादृच्छिक स्टैक ट्रेस से अधिक डरावनी उपयोगकर्ता को डरता नहीं है।)

1

लगभग हर लॉगिंग फ्रेमवर्क एक तरीका प्रदान करता है जिसमें हम एक संदेश के साथ फेंकने योग्य वस्तु को पार कर सकते हैं। पसंद:

public trace(Marker marker, String msg, Throwable t); 

वे फेंकने योग्य वस्तु के स्टैकट्रैक को प्रिंट करते हैं।

3

सरल में, e.printStackTrace() अच्छी प्रथा नहीं है, क्योंकि यह मानक त्रुटि के लिए स्टैक ट्रेस को प्रिंट करता है। इस वजह से आप वास्तव में नियंत्रित नहीं कर सकते कि यह आउटपुट कहां जाता है।

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