क्या कैच-ऑल में या बेस अपवाद क्लास में अपवादों को लॉग करना अधिक समझदार है?


15

मैं काफी बड़े वेब ऐप को फिर से शुरू करने की प्रक्रिया में हूं। प्रमुख मुद्दों में से एक असंगत त्रुटि हैंडलिंग है और मैं एक समझदार रणनीति के साथ आने की कोशिश कर रहा हूं। मैं एक कस्टम त्रुटि हैंडलर बना लिया है के माध्यम से, set_error_handler कि अनिवार्य रूप में पीएचपी त्रुटियों बदल जाता है ErrorExceptions , और कस्टम आधार अपवाद वर्ग कि सीधे से विरासत में मिली अपवाद

उत्पादन पर मैं एक सामान्य अपवाद कैच-ऑल का उपयोग कर रहा हूं, set_exception_handler के माध्यम से , और मैं मिश्रण में अपवाद लॉगिंग * जोड़ने वाला हूं । मेरी दुविधा जहां वास्तविक अपवाद करने के लिए है, आधार अपवाद वर्ग में या कैच-ऑल में।

मैंने इसे पकड़ने के लिए इसे लॉग-इन करने के कुछ कारणों के बारे में सोचा है:

  • कोड में काफी कुछ अपवाद हैं जिन्हें आधार अपवाद वर्ग के कुछ उपयुक्त बच्चे में परिवर्तित करने की आवश्यकता है। जब तक ऐसा नहीं होता, तब तक सभी अपवाद लॉग नहीं होंगे।
  • यह किसी भी तरह कैच-ऑल में अधिक स्वाभाविक लगता है, एक आधार अपवाद वर्ग केवल ऐसा होने से अधिक नहीं करना चाहिए। (यह एक एकल जिम्मेदारी सिद्धांत की बात हो सकती है, लेकिन यह सिर्फ एक भ्रामक भावना हो सकती है)

और आधार अपवाद वर्ग में लॉग इन करने का एक कारण:

  • वर्तमान में कैच-ऑल का उपयोग केवल उत्पादन पर किया जाता है। हमारे अन्य वातावरणों (विकास, परीक्षण) पर इसे पेश करना आसान होगा, लेकिन यह कुछ समायोजन के लिए कॉल करेगा, क्योंकि त्रुटियों को प्रति पर्यावरण भिन्न तरीके से नियंत्रित किया जाता है, क्योंकि उत्पादन पर वे 404/503 त्रुटि पृष्ठों पर अनुवादित होते हैं।

क्या अपवादों को स्वीकार करने के लिए कोई स्वीकार्य अभ्यास है?

* लॉगिंग में पहली बार एक पाठ फ़ाइल में लिखना शामिल होगा, और यह कुछ प्रकार के अपवादों के लिए मेल भेजने के लिए विकसित हो सकता है।


कुछ स्पष्टीकरण, @ unholysampler के जवाब से संकेत मिलता है :

मैं 2 * 10 ^ 6 के स्लोकोड कोडबेस का सामना कर रहा हूं, बहुत सारे थर्ड पार्टी सामान के साथ, जिनका मुझ पर कोई नियंत्रण नहीं है, और कुछ कोड जिनका मेरे पास PHP में पूर्व-तारीखों के अपवादों पर नियंत्रण है। और कुछ भद्दे हालिया कोड भी हैं, हम लंबे समय तक तीव्र दबाव से उबर रहे हैं, जहां हमें वास्तव में सोचना बंद करना पड़ा और बस हैक कर लिया गया।

हम सभी विसंगतियों को दूर करने और एक समझदार त्रुटि से निपटने के दृष्टिकोण को पेश करने के लिए सक्रिय रूप से मना कर रहे हैं, लेकिन इसमें कुछ समय लगने वाला है। जब तक मैं उस बिंदु तक नहीं पहुँच जाता, जहाँ त्रुटियों को उचित तरीके से नियंत्रित किया जाता है, तब तक मुझे और अधिक दिलचस्पी है। मैं शायद किसी बिंदु पर एक समझदार अपवाद की रणनीति पर एक और सवाल पूछूंगा।

लॉगिंग के पीछे मुख्य प्रेरणा मेरे फोन पर एक ईमेल प्राप्त करना है जब भी उत्पादन पर कुछ बुरा होता है। मुझे परवाह नहीं है अगर डेटा डंप बहुत बड़ा हो जाता है, अगर वे करते हैं तो मेरे पास एक क्रॉन जॉब होगा जो हर अब और फिर पुराने को हटा देगा।

जवाबों:


11

संक्षेप में, एकमात्र समय जब आपको किसी अपवाद के अस्तित्व को लॉग इन करना चाहिए, जब आप इसे संभाल रहे हों।

जब आप एक अपवाद फेंकते हैं, तो ऐसा इसलिए होता है क्योंकि आपका कोड एक ऐसी स्थिति में पहुंच गया है जहां यह सही ढंग से आगे नहीं बढ़ सकता है। एक अपवाद को फेंककर, आप अपने प्रोग्राम को हुई त्रुटि के बारे में एक विशिष्ट संदेश का प्रतिनिधित्व कर रहे हैं। आपको एक अपवाद नहीं पकड़ना चाहिए जब तक कि आप एक ऐसे बिंदु पर न हों जहां इसे ठीक से संभाला जा सके।

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

आपका अपवाद कैच-ऑल, आपके कोड को एक बदसूरत मौत को दुर्घटनाग्रस्त करने से बचाने के लिए आपका अंतिम प्रयास है। यदि आपने इसे दूर कर लिया है, तो आप सभी राज्य और त्रुटि जानकारी को लॉग इन कर सकते हैं। तब आप उपयोगकर्ता को यह बताने की पूरी कोशिश करते हैं कि सब कुछ बंद होने से पहले प्रोग्राम क्रैश हो रहा है। आपका लक्ष्य कभी भी इस कोड को निष्पादित नहीं करना चाहिए।

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


मैंने आपके उत्तर द्वारा पूछे गए प्रश्न पर कुछ स्पष्टीकरण जोड़े हैं। जिस प्रश्न पर आप प्रश्न पूछते हैं, उसके व्यावहारिक पक्ष पर, आप कैच-ऑल में लॉग इन करने का प्रस्ताव रखते हैं?
यानिस

1
@YannisRizos: हां, आपको अपने पहले चरण के रूप में कैच-ऑल को लागू करना चाहिए। कैच-ऑल के बारे में मैंने जो कुछ कहा वह यह सुनिश्चित करने के लिए अधिक था कि आपने इसे अपने कोड प्रवाह के सामान्य हिस्से के रूप में उपयोग नहीं किया। एक अनहेल्दी अपवाद हैंडलर को लागू करना महत्वपूर्ण है क्योंकि यह आपको हर बार बहुत सारी जानकारी प्राप्त करने की अनुमति देता है जब आपका कोड हर बुरे काम को करता है।
अनहेल्सीप्लमर

क्या कोई लॉगिंग फ्रेमवर्क नहीं हैं जो "यहाँ सामान की एक गुच्छा को आसानी से संभाल सकता है जो कि तब तक लॉग इन होना चाहिए जब तक कि वह सुपरशूट न हो जाए"? प्रत्येक परत जो अपवाद देखती है, वह पिछले से डेटा को सुपरडेड कर सकती है, सिवाय इसके कि यदि कोई नया अपवाद स्टैक के दौरान फेंक दिया जाता है तो अंतिम लॉग रिपोर्ट को अलिखित नहीं किया जाएगा और इस प्रकार दर्ज किया जाएगा। क्या कोई ढांचा इस तरह के पैटर्न का समर्थन नहीं करता है?
सुपरकैट

3

यदि आपकी भाषा / रनटाइम आपको आसानी से अपवाद के स्रोत को निर्धारित नहीं करने देता है, तो इसे फेंकने पर लॉग करने का मामला है। C ++ और कुछ JS इंजन उस समय तक अपवाद के फ़ाइल + लाइन या कॉल स्टैक को उजागर नहीं करते हैं, जब तक आप इसे पकड़ नहीं लेते / लेकिन यह जानकारी उस समय उपलब्ध होती है जब आप अपवाद का निर्माण करते हैं।

हमारा समाधान एक तंत्र प्रदान करना था जो इन मुद्दों का निदान करने की कोशिश करते समय एक सस्ते-स्टैक के साथ अपवाद के प्रकार को सक्षम करने के लिए रनटाइम कॉन्फ़िगरेशन का उपयोग करता था।


+1 यह निश्चित रूप से फेंक में प्रवेश करने का एक अच्छा मामला है ... PHP पकड़ पर एक पूर्ण स्टैक ट्रेस प्रदान करता है, इसलिए मैं शायद दूसरे रास्ते पर जाऊंगा ...
yannis
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.