यह कैसे निर्धारित किया जाए कि एक अपवाद एक विशेष प्रकार का है


82

मेरे पास ट्राई कैच कोड का एक टुकड़ा है:

try 
{
    ...
}
catch(Exception ex) 
{
    ModelState.AddModelError(
        "duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}

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

नीचे त्रुटि है जिसे मैं पकड़ना चाहता हूं। ध्यान दें कि यह आंतरिक अपवाद में है। क्या कोई मुझे बता सकता है कि इसे विशेष रूप से कैसे पकड़ा जाए?

यहाँ छवि विवरण दर्ज करें


1
देखिये दाविद का जवाब। आम तौर पर पकड़ना Exceptionसबसे अच्छा अभ्यास नहीं है। आप जितना संभव हो उतना विशिष्ट होना चाहिए और कुछ भी आप उपयोगकर्ता / ढांचे को बुलबुला संभाल नहीं सकते हैं।
रयान

1
इस उत्तर को देखें: stackoverflow.com/questions/3967140/…
Rob Packwood

जवाबों:


141

अपने वर्तमान पकड़ने से पहले निम्नलिखित जोड़ें:

catch(DbUpdateException ex)
{
  if(ex.InnerException is UpdateException)
  {
    // do what you want with ex.InnerException...
  }
}

C # 6 से, आप निम्न कार्य कर सकते हैं:

catch(DbUpdateException ex) when (ex.InnerException is UpdateException)
{
    // do what you want with ex.InnerException...
}

3
वहाँ एक पकड़ "जब वाक्य रचना" नहीं है?
कॉन्टेरियो

4
@conteriocatch(DbUpdateException ex) when (!(ex.InnerException is UpdateException))
टॉम

16

System.Threading.ThreadAbortExceptionअपने अपवाद के साथ बदलें ।

try
{
    //assume ThreadAbortException occurs here
}
catch (Exception ex)
{
    if (ex.GetType().IsAssignableFrom(typeof(System.Threading.ThreadAbortException)))
    {
         //what you want to do when ThreadAbortException occurs         
    }
    else
    {
         //do when other exceptions occur
    }
}

3

अपवाद का नाम प्राप्त करने के लिए आप इसका उपयोग कर सकते हैं

    catch (Exception exc){
       if (exc.GetType().FullName == "Your_Exception") 
       {
          // The same can be user for InnerExceptions
          // exc.InnerException.GetType().FullName
       }
   }

2
स्ट्रिंग द्वारा अपवाद प्रकार की तुलना खतरनाक है। एक दुर्भाग्यपूर्ण वर्तनी की गलती एक दुःस्वप्न से निपटने के लिए अपवाद बनाने जा रही है!
तेजस पेंडसे

माना। टाइप टू टाइप की तुलना करें। exc.GetType () == टाइपोफ़ (YourException)
ली ऑड्स

2

टिप्पणी करने के लिए पर्याप्त नहीं है। @Conterio सवाल के जवाब में (@ दाविद पिरस जवाब में):

वहाँ एक पकड़ "जब वाक्य रचना" नहीं है?

वहाँ है।

catch (Exception e) when (!(e is ArgumentException)) { }

-3

आप SQLException class पर एक नज़र डाल सकते हैं - और अपवाद के संदेश की सामग्री की जांच कर सकते हैं यदि इसमें वह है जो अब आप अपने आंतरिक अपवाद में देखते हैं। इस तरह से:

try
{
    //your code here
}
catch (SQLException ex)
{
    if (ex.Message.Contains("Cannot insert duplicate key in obj...."))
    {
        //your code here
    }
}

1
मुझे संदेह है कि SqlException को सीधे फेंक दिया गया है, लेकिन केवल एक आंतरिक अपवाद के रूप में। इसके अलावा, संदेश पाठ के खिलाफ तुलना करने के बजाय त्रुटि संख्या की जांच करना बेहतर होगा।
जॉन सॉन्डर्स

हाँ, आप त्रुटि संख्या की जाँच कर सकते हैं। टिप्पणी के लिए धन्यवाद।
एन बीजी

आप त्रुटि संख्या के खिलाफ कैसे जांच करेंगे? मुझे यकीन नहीं है कि यह संख्या क्या है क्योंकि यह वास्तव में विशिष्ट त्रुटि है?
दोपहर 12:56
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.