2010-07-20 29 views
12
try { 
     if (isFileDownloaded) 
      //do stuff 
     else 
      throw new CustomException() 
    } 
    catch (Exception e) 
    { 
     // something went wrong save error to log 
    } 
    finally 
    { 
     //release resources 
    } 

मेरा प्रश्न है होगा catch कैच ApplicationException कोशिश ब्लॉक में फेंक दिया? क्या यह खराब कोडिंग शैली में है? क्या इसे किसी अन्य तरीके से लिखा जाना चाहिए?फेंक अपवाद

उत्तर

21

catch अपने अपवाद पकड़ेगा (और किसी भी अन्य ऐसा होता है)। ऐसा कहा जा रहा है कि, जब संभव हो तो मैं इस तरह के कोड लिखने से बचने की कोशिश करता हूं।

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

catch का उपयोग करना आपके try ब्लॉक के तरीकों से फेंकने वाले अपवादों को पकड़ने के लिए अधिक उपयोगी, आईएमओ है। यह, उदाहरण के लिए, और अधिक उपयोगी हो अगर आपके // do stuff खंड एक विधि है कि एक अपवाद उठाया कॉल करने के लिए हुआ होगा।

इसके अलावा, मैं हर अपवाद (Exception e) को पकड़ने की सलाह नहीं देता, बल्कि विशिष्ट प्रकार के अपवाद जिन्हें आप सही तरीके से संभाल सकते हैं। प्रयोजनों के प्रवेश करने के लिए उपयोग, लेकिन अभी भी यह बुलबुला अप कॉल स्टैक दे: यानी - अगर आप अपनी पकड़ के भीतर अपवाद rethrowing रहे हैं इसका एक अपवाद होगा।

+3

कुछ भी आप पकड़ आप और है कि अपवाद को जन्म देती है में कर सकते हैं में करना होगा। आपको केवल असाधारण परिस्थितियों में अपवाद उठाना चाहिए। एक तरफ के रूप में आपको अपवाद वस्तुओं 'ई' को कॉल करने के लिए उपयोग नहीं किया जाना चाहिए। यह ईवेंट हैंडलर में 'EventArgs' पैरामीटर के साथ संघर्ष करेगा। –

+0

@Philip: "। कुछ भी आप पकड़ आप और है कि अपवाद को जन्म देती है में कर सकते हैं में करना होगा" - यही कारण है कि मेरी बात थी :) अपने अन्य तर्क के लिए के रूप में, मैं एक बात करने के लिए सहमत है, लेकिन मैं व्यक्तिगत रूप से अपवाद नामकरण के साथ कोई समस्या नहीं वस्तुओं ई है (हालांकि मैं आमतौर पर अधिक सार्थक नाम का उपयोग करें), क्योंकि वे शायद ही कभी सीधे EventArgs साथ इस्तेमाल कर रहे हैं । –

+0

डाउनवॉट्स क्यों? बस उत्सुक;) –

5

हां, यह ApplicationException पकड़ जाएगा क्योंकि यह Exception से प्राप्त होता है।

आधार अपवाद हैंडलिंग ज्यादातर मामलों जब तक आप लॉग इन करें या अपवाद एक अलग प्रकार के साथ कुछ करने के लिए की जरूरत है ठीक होना चाहिए ...

try{ 
    if (isFileDownloaded) 
     //do stuff 
    else 
     throw new ApplicationException(); 
} 
catch(ApplicationException ae) 
{ 
    // log it application exception here... 
} 

catch(Exception ex) 
{ 
    // log all other exceptions here... 
} 
finally 
{ 
    // release resources... 
} 
1

हां पकड़ आपके एप्लिकेशन अपवाद को पकड़ लेगी और हाँ खराब कोडिंग शैली है। एक अच्छे सामान्य नियम के रूप में केवल विशिष्ट अपवाद को पकड़ें और जिन्हें आप कुछ करने जा रहे हैं, जैसे आवेदन स्थिति को ठीक करना।

1

इसके अलावा, FYI, ApplicationException को .NET 2.0 से प्राप्त करने के अपवाद के रूप में बहिष्कृत कर दिया गया है। इसे कभी भी फेंकने के अपवाद के रूप में कभी नहीं बनाया गया था, इसलिए आपको शायद इसका उपयोग नहीं करना चाहिए।

+0

FxCop इन नियमों को लागू करता है। आप आधार अपवाद नहीं फेंक सकते हैं या 'एप्लिकेशन अपवाद' या 'सिस्टम अपवाद' से प्राप्त नहीं कर सकते हैं। ये 'अपवाद' के साथ ही मूल अपवाद हैं –

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