यह सवाल इस लेख के इर्द-गिर्द एक चर्चा से उछला , जहां मुझे कोई अच्छा जवाब नहीं मिला।
अपने अपवाद को क्यों लॉग इन करना चाहिए और फिर इसे वापस फेंकना चाहिए (मूल स्टैक ट्रेस को संरक्षित करना) एक बुरा विचार है यदि आप इसे अन्यथा नहीं संभाल सकते हैं?
यह सवाल इस लेख के इर्द-गिर्द एक चर्चा से उछला , जहां मुझे कोई अच्छा जवाब नहीं मिला।
अपने अपवाद को क्यों लॉग इन करना चाहिए और फिर इसे वापस फेंकना चाहिए (मूल स्टैक ट्रेस को संरक्षित करना) एक बुरा विचार है यदि आप इसे अन्यथा नहीं संभाल सकते हैं?
जवाबों:
मुझे लगता है कि इसका उत्तर काफी हद तक है क्योंकि अगर आप इसे संभाल नहीं सकते हैं तो आप इसे क्यों पकड़ रहे हैं? क्यों न जाने किसको संभाल सकें (या जिसे कोई विकल्प नहीं होने के बावजूद छोड़ दिया गया हो) उसे लॉग इन करें, अगर उन्हें लगता है कि यह लॉग-योग्य है?
यदि आप इसे पकड़ते हैं और इसे लॉग करते हैं और इसे फिर से उखाड़ फेंकते हैं, तो अपस्ट्रीम कोड के लिए कोई रास्ता नहीं है यह जानने के लिए कि आप पहले ही अपवाद को लॉग इन कर चुके हैं, और इसलिए एक ही अपवाद दो बार लॉग इन हो सकता है। या इससे भी बदतर, यदि सभी अपस्ट्रीम कोड इसी पैटर्न का अनुसरण करते हैं, तो अपवाद को मनमाने ढंग से कई बार लॉग किया जा सकता है, एक बार कोड में प्रत्येक स्तर के लिए जो इसे पकड़ने का फैसला करता है, इसे लॉग इन करें, और फिर इसे फिर से फेंक दें।
इसके अलावा कुछ का तर्क हो सकता है कि अपवादों को फेंकने और पकड़ने के बाद से अपेक्षाकृत महंगा संचालन होता है, यह सब पकड़ना और पुनर्परिभाषित करना आपके रनटाइम प्रदर्शन में मदद नहीं करता है। न ही यह आपके कोड को सुगमता या स्थिरता के संदर्भ में मदद कर रहा है।
लॉग-एंड-थ्रो एक अच्छा पैटर्न है यदि इकाई को पकड़ने और पुनर्विचार करने के कारण यह विश्वास करने का कारण है कि इसमें ऐसी जानकारी है जो कॉल स्टैक तक लॉग इन नहीं होगी - कम से कम सबसे वांछित फैशन में नहीं। इसके कुछ कारण हो सकते हैं:
e.getMessage()
UI पर प्रदर्शित / स्टैकट्रेस, साथ ही इसे REST प्रतिक्रिया के रूप में भेजना) को स्वयं भेद्यता के रूप में माना जाना चाहिए, क्योंकि रनटाइम अपवाद में किसी भी प्रकार की संवेदनशील जानकारी हो सकती है। # 2 के बारे में: आप अपवाद को उन सभी सूचनाओं को जोड़ सकते हैं जिन्हें आप ग्राहक को जानना चाहते हैं (+ मूल कारण), कुछ भी लॉग करने की आवश्यकता नहीं है।
मुझे लगता है कि सबसे सरल कारण यह है कि आपके पास आमतौर पर आपके लिए एक एकल-स्तरीय हैंडलर होता है, इसलिए इस अपवाद हैंडलिंग के साथ कोड को प्रदूषित करने की कोई आवश्यकता नहीं है।
क्रॉस-कटिंग चिंताओं का तर्क मूल रूप से यह है कि यह उन त्रुटियों से निपटने में समय की बर्बादी है जो आपको चिंता नहीं करते हैं। जब तक एक उपयुक्त हैंडलर नहीं मिल सकता है, कॉल स्टैक को त्रुटि बुलबुले में जाने के लिए बेहतर है।
मेरी राय में, एकमात्र समय जब आपको अपवाद को पकड़ना चाहिए, जब आप परिणामों के साथ कुछ उपयोगी कर सकते हैं। केवल लॉग करने के लिए पकड़ना उपयोगी नहीं है, क्योंकि आप उस काम को और अधिक केंद्रीकृत कर सकते हैं।
IMO लॉग एंड थ्रो, लिस्ट सरप्राइज़ के सिद्धांत का स्पष्ट उल्लंघन है।
यदि कॉल कॉल स्टैक को अपवाद को ठीक से संभाला जाता है, तो यह त्रुटि लॉग प्रविष्टि के लायक नहीं हो सकता है। और फिर यह एक त्रुटि लॉग प्रविष्टि खोजने के लिए भ्रमित है।