2010-04-04 15 views
5
public void EatDinner(string appetizer, string mainCourse, string dessert) 
{ 
    try 
    { 
     // Code 
    } 
    catch (Exception ex) 
    { 
     Logger.Log("Error in EatDinner", ex); 
     return; 
    } 
} 

जब किसी विशिष्ट विधि में कोई अपवाद होता है, तो मुझे लॉगिंग क्यों करनी चाहिए?अपवाद होने पर लॉग इन करना क्या है?

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

क्या कोई सर्वोत्तम प्रथाएं या तरीके हैं जो मैं इस अतिरिक्त काम को कम कर सकता हूं? क्या मुझे इस तरह की प्रत्येक विधि में पैरामीटर लॉग करना चाहिए?

Logger.Log("Params: " + appetizer + "," + mainCourse + "," + dessert, ex); 

क्या वर्तमान वातावरण को लॉग करने का कोई बेहतर तरीका है? अगर मैं इसे इस तरह से करता हूं, तो क्या मुझे अपने आवेदन में मौजूद प्रत्येक विधि के लिए यह सब सामान लिखना होगा? क्या इस तरह के परिदृश्य से संबंधित कोई सर्वोत्तम प्रथा है?

उत्तर

5

एक सामान्य नियम के रूप में, मैं कहूंगा कि त्रुटि के कारण होने वाली घटनाओं के पाठ्यक्रम को पुन: पेश करने के लिए आवश्यक सभी जानकारी लॉग करें। ध्यान दें कि आपको catch ब्लॉक के अंदर सबकुछ लॉग इन करने की आवश्यकता नहीं है: आप अपने कोड में चारों ओर लॉग कथन (डीबग) डाल सकते हैं, विधियों के अंदर इत्यादि। जो आपको अपवाद से पहले सीधे क्या चल रहा था का पालन करने में सक्षम बनाता है। साथ ही, आपको अपवाद में जानकारी को सही लक्षण के बारे में जानकारी देना चाहिए जो इसके कारण हुआ।

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

यह भी अपने साथियों के साथ इस विषय पर चर्चा और बाहर काम कैसे घटनाओं लॉग इन करने का एक मोटा परियोजना सम्मेलन, अपवाद आदि को संभालने के लिए करने की कोशिश करने में मदद करता है यह आप अन्यथा का पीछा करते हुए कीड़े पर खर्च बहुत समय की बचत हो सकती और/या आपके बहुत सहकर्मियों द्वारा उत्पादित कोड में सुधार :-(

4

यह बहुत ही भयानक कोड है। यह अपवाद खाता है, संभावित रूप से एक अपरिभाषित स्थिति में आवेदन छोड़ रहा है। आम तौर पर, हर तरह से अपवाद लॉग (लेकिन डॉन ' कोशिश ब्लॉक में कोड के हर बिट को लपेटें), लेकिन फिर इसे फिर से फेंक दें।

+2

ध्यान दें कि फिर से फेंक का उपयोग किया जाना चाहिए 'फेंक;' और * नहीं * 'फेंक पूर्व;', कॉल स्टैक पोंछते से बचने के लिए। –

1

आपके लॉगिंग फ्रेमवर्क को आपके लिए जितना संभव हो उतना संदर्भ कैप्चर करना चाहिए। कम से कम यह उस कक्षा को आसानी से कैप्चर कर सकता है जिसमें त्रुटि हुई है। इसे स्टैकट्रैक और किसी भी आंतरिक अपवाद सहित पूर्ण अपवाद को भी लॉग करना चाहिए।

As I answered in your other question आपको विभिन्न लॉग स्तरों का उपयोग करना चाहिए। एक बार ऐसा करने के बाद, यदि आप नियंत्रण कंटेनर का उलटा उपयोग कर रहे हैं, तो यह एक इंटरसेप्टर को तारित करने का एक आसान काम है जो सभी विधि कॉल को रोक देगा और यदि आप डिबगिंग मोड में हैं तो कॉल, टाइमस्टैम्प और किसी भी पैरामीटर लॉग करें।

0

रिको मारियानी (सीएलआर परफ) से example यहां आपको सभी अपवाद क्यों नहीं लेना चाहिए।वास्तविक समस्या का निदान करना वास्तव में कठिन हो सकता है।

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