c# - सही वाक्यविन्यास का उपयोग करके/पकड़ें+कोशिश करें




try-catch using-statement (5)

कौनसा:

using (var myObject = new MyClass())
{
   try
   {
      // something here...
   }
   catch(Exception ex)
   {
      // Handle exception
   }
}

या

try
{
   using (var myObject = new MyClass())
   {
      // something here...
   }
}
catch(Exception ex)
{
   // Handle exception
}

एक महत्वपूर्ण बात है जिसे मैं यहां कॉल करूंगा: पहला व्यक्ति MyClass कन्स्ट्रक्टर को कॉल करने से उत्पन्न कोई अपवाद नहीं MyClass


चूंकि एक प्रयोग ब्लॉक एक कोशिश / आखिरकार ( MSDN ) का सिंटैक्स सरलीकरण है, व्यक्तिगत रूप से मैं निम्नलिखित के साथ जाऊंगा, हालांकि मुझे संदेह है कि यह आपके दूसरे विकल्प से काफी अलग है:

MyClass myObject = null;
try {
  myObject = new MyClass();
  //important stuff
} catch (Exception ex) {
  //handle exception
} finally {
  if(myObject is IDisposable) myObject.Dispose();
}

निर्भर करता है। यदि आप विंडोज कम्युनिकेशन फाउंडेशन (डब्ल्यूसीएफ) का उपयोग कर रहे हैं, तो using(...) { try... } सही तरीके से काम नहीं करेगा अगर कथन का using में प्रॉक्सी अपवाद स्थिति में है, यानी इस प्रॉक्सी को डिस्पोज़ करने से एक और अपवाद होगा।

व्यक्तिगत रूप से, मैं कम से कम हैंडलिंग दृष्टिकोण में विश्वास करता हूं, यानी केवल अपवाद को संभालता हूं जिसे आप निष्पादन के बिंदु पर जानते हैं। दूसरे शब्दों में, यदि आप जानते हैं कि using में एक चर का प्रारंभिक अपवाद एक विशेष अपवाद फेंक सकता है, तो मैं इसे try-catch साथ लपेटता हूं। इसी प्रकार, यदि शरीर using भीतर कुछ हो सकता है, जो सीधे using करने वाले चर से संबंधित नहीं है, तो मैं इसे उस विशेष अपवाद के लिए एक और try साथ लपेटता हूं। मैं शायद ही कभी अपने catch es में Exception का उपयोग करें।

लेकिन मुझे IDisposable पसंद है और हालांकि मैं शायद पक्षपातपूर्ण using रहा हूँ।


मैं दूसरा पसंद करता हूं। ऑब्जेक्ट के निर्माण से संबंधित जाल त्रुटियों के साथ-साथ मई भी हो सकता है।


यदि आपके कैच स्टेटमेंट को उपयोग कथन में घोषित वैरिएबल तक पहुंचने की आवश्यकता है, तो अंदर ही आपका एकमात्र विकल्प है।

यदि आपके कैच स्टेटमेंट को डिस्पोजेक्ट करने से पहले उपयोग में संदर्भित ऑब्जेक्ट की आवश्यकता होती है, तो अंदर आपका एकमात्र विकल्प है।

यदि आपका कैच स्टेटमेंट अज्ञात अवधि की कार्रवाई करता है, जैसे उपयोगकर्ता को संदेश प्रदर्शित करना, और इससे पहले कि आप अपने संसाधनों का निपटान करना चाहते हैं, तो बाहर आपका सबसे अच्छा विकल्प है।

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

तो मेरा सामान्य अनुशंसा बाहरी बाहर है।

private void saveButton_Click(object sender, EventArgs args)
{
    try
    {
        SaveFile(myFile); // The using statement will appear somewhere in here.
    }
    catch (IOException ex)
    {
        MessageBox.Show(ex.Message);
    }
}






using-statement