मैं वर्तमान में एक बहुस्तरीय वास्तुकला के साथ एक बड़े सबसिस्टम को फिर से शुरू कर रहा हूं, और मैं एक प्रभावी त्रुटि लॉगिंग \ हैंडलिंग रणनीति डिजाइन करने के लिए संघर्ष कर रहा हूं।
मान लीजिए कि मेरी वास्तुकला में निम्नलिखित तीन परतें शामिल हैं:
- सार्वजनिक इंटरफ़ेस (IE एक MVC नियंत्रक)
- डोमेन परत
- डेटा एक्सेस लेयर
भ्रम का मेरा स्रोत वह जगह है जहां मुझे त्रुटि लॉगिंग \ हैंडलिंग को लागू करना चाहिए:
सबसे आसान समाधान शीर्ष स्तर पर लॉगिंग को लागू करना होगा (आईई पब्लिक इंटरफेस \ एमवीसी नियंत्रक)। हालांकि यह गलत लगता है क्योंकि इसका मतलब है कि अलग-अलग परतों के माध्यम से अपवाद को बुदबुदाना, और फिर इसे लॉग करना; इसके स्रोत पर अपवाद को लॉग करने के बजाय।
इसका स्रोत पर अपवाद लॉगिंग स्पष्ट रूप से सबसे अच्छा समाधान है क्योंकि मेरे पास सबसे अधिक जानकारी है। इसके साथ मेरी समस्या यह है कि मैं सभी अपवादों को पकड़े बिना स्रोत पर हर अपवाद को नहीं पकड़ सकता, और डोमेन / सार्वजनिक इंटरफ़ेस परत में, यह अपवादों को पकड़ने का कारण होगा जो पहले से ही पकड़े गए, लॉग किए गए हैं और नीचे की परत द्वारा फिर से फेंक दिए गए हैं ।
एक और संभावित रणनीति # 1 और # 2 का मिश्रण है; जिससे मैं उस स्तर पर विशिष्ट अपवादों को पकड़ता हूं, जो कि वे सबसे अधिक होने की संभावना रखते हैं (आईई कैचिंग, लॉगिंग और
SqlExceptions
डेटा एक्सेस लेयर में फिर से फेंकना ) और फिर शीर्ष स्तर पर किसी भी अन्य अनकैप्ड अपवाद को लॉग करते हैं। हालांकि इसके लिए मुझे शीर्ष स्तर पर हर अपवाद को पकड़ने और फिर से लिखने की भी आवश्यकता होगी, क्योंकि मैं उन त्रुटियों के बीच अंतर नहीं कर सकता जो पहले से ही लॉग इन किए गए हैं, जो नहीं हैं।
अब, स्पष्ट रूप से यह अधिकांश सॉफ्टवेयर अनुप्रयोगों में एक मुद्दा है, इसलिए इस समस्या का एक मानक समाधान होना चाहिए, जिसके परिणामस्वरूप अपवादों को स्रोत पर पकड़ा जा सकता है, और एक बार लॉग इन किया जा सकता है; हालाँकि मैं अभी यह नहीं देख सकता कि यह कैसे करना है।
ध्यान दें, इस सवाल का शीर्षक ' एक बहु स्तरीय अनुप्रयोग में अपवादों को लॉग करना' के समान है , हालांकि उस पोस्ट के उत्तर में विस्तार का अभाव है और मेरे प्रश्न का उत्तर देने के लिए पर्याप्त नहीं है।
The easiest solution would be to implement the logging at the top level
- यह करो। उनके स्रोत पर अपवाद लॉग करना एक अच्छा विचार नहीं है और मैंने जो भी आवेदन किया है वह यह है कि यह पीआईए को डिबग करने के लिए था। अपवादों को संभालने के लिए कॉल करने वाले की जिम्मेदारी होनी चाहिए।
try{ ... } catch(Exception ex) { Log(ex); }
परिणामस्वरूप प्रत्येक लेयर पर एक ही अपवाद लॉग किया जाएगा। (यह भी लगता है कि कोड बेस में हर परत पर हर अपवाद को पकड़ने के बजाय बुरा अभ्यास।)