2012-11-08 14 views
6

मैं एक हरे रंग का डेवलपर हूं जो एक बड़े बहु-परत जावा एप्लिकेशन में त्रुटि प्रबंधन पर हैंडल (हर-हर) प्राप्त करने का प्रयास कर रहा है। ऐसी कई स्थितियां हैं जहां मेरा मानना ​​है कि कई परतों के माध्यम से अपवादों का सामना करना एक अच्छा विचार है; जैसे जब निम्नतम स्तर पर कुछ बाहरी सेवा से बाहर बुला में एक विफलता समस्याओं सभी तरह ध्यान में रखते हुए ऊपर का कारण बनता है:जब जंजीर अपवाद लॉग इन करें?

  • सामग्री एक्स अनुरोध किया, लेकिन उपयोगकर्ता अधिकृत नहीं है
    • की वजह से: अधिकृत की सूची उन रिक्त है
      • वजह से द्वारा: उपयोगकर्ता के प्रबंधन वेब सेवा प्रतिक्रिया व्यक्त बुरा अनुरोध पैरामीटर foo 'xyz'
0 इस प्रारूप में होना चाहिए

सबसे महत्वपूर्ण अपवाद, जिसकी स्टैक्स्ट्रेस मैं वास्तव में जांचना चाहता हूं, श्रृंखला में आखिरी है; कि मैंने एक बुरा अनुरोध किया है और मुझे foo के स्वरूपण को ठीक करने की आवश्यकता है। लेकिन जब मैंने परतों के माध्यम से इस अपवाद को उछाल दिया, तो प्रत्येक परत के लिए अर्थपूर्ण अपवादों में अच्छी तरह से बंधे हुए ... जब मैं अंततः चीज़ को पकड़ता और लॉग करता हूं, तो डिफ़ॉल्ट लॉगिंग व्यवहार हमेशा मुझे बाहरीतम अपवाद के बारे में विस्तार से दिखाता है, और मूल कारण के stacktrace की शायद 5 लाइनें।

यह मुझे अपवादों को लॉग इन करना चाहता है, और उन्हें बुलबुला करने दें, लेकिन फिर आप अधिकतर चीज़ों को दो बार लॉगिंग करते हैं; जब वे होते हैं और अंततः उन्हें पकड़ा जाता है।

यहां सबसे अच्छा अभ्यास क्या है?

+0

इस पर बहुत सारी राय होगी, लेकिन कोई 'सत्य' नहीं है। चुनें कि आपके लिए क्या काम करता है, लोग इससे कोई फर्क नहीं पड़ता कि आप क्या चुनते हैं। (व्यक्तिगत रूप से मैं इस बात को फिर से भरना पसंद करता हूं बाहरीतम परत और इसे वहां लॉग करें) – Friso

उत्तर

1

महान प्रश्न, मैं आपको प्राप्त होने वाले अन्य उत्तरों के बारे में उत्सुक हूं।

मुझे "अधिक बेहतर है" दृष्टिकोण लेना है, और रास्ते के प्रत्येक चरण पर लॉग इन करना है। क्या यह बड़े लॉग बनाता है? हां, लेकिन जब आप किसी बड़े जावा एप्लिकेशन में कोई समस्या डिबग कर रहे हैं, तो आप अपनी प्रत्येक लॉग लाइन के लिए आभारी होंगे। बड़ी फ़ाइलों के माध्यम से फ़िल्टर करने में आपकी सहायता के लिए टूल भी हैं (कम से कम grep, awk, sed तीन)।

एक और तकनीक इस प्रवेश कोड लिखने, लेकिन (आप log4j की तरह कुछ का उपयोग कर रहे हैं, TRACE स्तर पर) इसे चालू नीचे है। इस तरह, आपको किसी समस्या में भाग लेना चाहिए, आपके पास लॉग उपलब्ध नहीं हो सकते हैं, लेकिन यह एक पंक्ति परिवर्तन है (लॉगिंग थ्रेसहोल्ड को कम करने के लिए) और आप डिबगिंग के लिए डेटा की एक संपत्ति उत्पन्न करना शुरू करते हैं।

पिछली तकनीक के साथ, अधिकांश लॉगिंग लाइब्रेरीज़ (फिर मैं लॉग 4j के अपने ज्ञान पर वापस आ रहा हूं) आपको विभिन्न जावा पैकेजों के लॉग स्तर को ट्यून करने की अनुमति देता है। इसका मतलब यह है कि आप इन सभी "कैच एंड रीथ्रो" लॉग लाइनों को ट्रेस के रूप में लिख सकते हैं, और WARN पर निचले स्तर के पैकेज पर लॉगिंग को बंद कर सकते हैं जबकि आप ऊपरी स्तर के पैकेज DEBUG या TRACE पर रखते हैं।

2

मैं अपवाद प्रबंधन के एक अलग दृष्टिकोण की सिफारिश करता हूं। एप्लिकेशन की शीर्षतम परत (जैसे अनुरोध प्रविष्टि बिंदु) पर किसी भी रनटाइम अपवाद को कॉल करने के लिए एक प्रयास पकड़ ब्लॉक बनाएं। यह बेहतर आप 2 पकड़ ब्लॉक है कि है: - अपने एप्लिकेशन विशिष्ट के लिए (व्यवसाय) अपवाद - आराम के लिए (अपवाद)

आप देख सकते हैं youl'l आप खुद अपवाद प्रकार है कि आप बढ़ा देंगे शुरू करने की जरूरत है विभिन्न उद्देश्यों के लिए अलग अपवाद बनाने के लिए। उदाहरण के लिए आप प्रत्येक इंटीग्रेशन इत्यादि के लिए आवेदन की प्रत्येक परत के लिए एक कस्टम अपवाद बना सकते हैं।अनचेक निष्पादन का प्रयोग करें क्योंकि वे सभी शीर्ष स्तर पर संभाले जाएंगे। जब कोई असाधारण स्थिति ocures (निम्न स्तर अपवाद का पकड़) आपको चाहिए: - व्यवसाय संदर्भ से जुड़े विवरण को रखें (उदाहरण के लिए "डीबी से खाता डेटा लोड करने में विफल" - मूल अपवाद का विवरण जोड़ें (उदाहरण के लिए "मूल त्रुटि: डीबी से कनेक्शन विफल हुआ ") - ट्रेस को ढीला न करने के लिए अपने अपवाद के लिए मूल अपवाद पास करें - दूसरे शब्दों में शीर्ष स्तर पकड़ने वाला ब्लॉक इसे उचित रूप से संभालने के लिए ज़िम्मेदार है (एक लेनदेन रोलबैक, त्रुटि संदेश दिखाएं या किसी और चीज की आपको आवश्यकता हो सकती है

+0

एक अच्छा दृष्टिकोण माना जाता है; जब मैं अपने कस्टम अपवादों को शीर्ष परत तक सभी तरह से बुलबुला करता हूं, तो मेरे पास एक स्थान होता है जहां मैं लॉगर को अपना मूल कारण पारित कर सकता हूं। लेकिन अगर ऐसा कोई स्थान है जहां मुझे पकड़ने और उनमें से एक लॉग इन करने की आवश्यकता है, तो मैं लपेटा हुआ अपवाद लॉग कर दूंगा। क्या मेरे रैपर अपवादों के स्टैकट्रैक को केवल एक या कोई लाइनों में छेड़छाड़ करने में कुछ गड़बड़ है? मैं नहीं देख सकता कि इससे कोई समस्या क्यों होगी, लेकिन स्टैकट्रैस को संशोधित करना मेरे लिए बिल्कुल सही नहीं है। – PotataChipz

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