2009-11-19 14 views
5

तो, मैं एक कस्टम वर्ग, MyClass
MyClass गुण है, जो अशक्त हो सकता है जिसमें एक सूची है (लेकिन हो नहीं होती हैं)।

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

अब किसी कारण से अपवाद अभी भी कंसोल पर लिखा जाता है, जो अपवाद हैंडलर कर रहा है।

मेरे पास इस समस्या के साथ एक वास्तविक अनुप्रयोग है, जिससे मेरा यूनिट परीक्षण विफल हो जाता है, भले ही अपवाद सही ढंग से संभाला जा सके और मैं इसे समझा नहीं सकता।
बिना क्रिया के अपवाद क्रमबद्ध

इसलिए मैंने कुछ नमूना कोड संलग्न किया है ताकि मैं खुद को बेहतर समझा सकूं, इसे वीएस से चलाएं।

अपडेट किया गया कोड
परिणाम:
System.InvalidOperationException
सरणी में दो तत्वों की तुलना करने में विफल।
हो गया!

तो ऐसा लगता है कि यह मेरे कस्टम अपवाद को संभालने और अपना खुद का फेंक रहा है?

using System; 
using System.Collections.Generic; 
using System.Data; 

namespace TestSortException 
{ 
    class Program 
    { 
     static void Main() 
     { 
      try 
      { 
       var list = new List<MyClass> 
             { 
              new MyClass("1"), 
              new MyClass(null), 
              new MyClass("fdsfsdf") 
             }; 



       list.Sort(new MyClassSorter()); 
      } 
      catch(Exception e) 
      { 
       Console.WriteLine(e.GetType()); 
       Console.WriteLine(e.Message); 
      } 

      Console.WriteLine("Done!"); 
      Console.ReadLine(); 

     } 
    } 

    class MyClassSorter : IComparer<MyClass> 
    { 
     public int Compare(MyClass x, MyClass y) 
     { 
//   try 
//   { 
       if (x.MyString == y.MyString) 
        return 0; 
       // Unhandled??? Exception here 
       if (x.MyString.Length > y.MyString.Length) 
        return 1; 

       return -1; 
//   } 
//   catch (Exception) 
//   { 
//    return -1; 
//   } 
     } 
    } 

    class MyClass 
    { 
     private string _myString; 

     public string MyString 
     { 
      get 
      { 
       if (_myString == null) throw new DataException("MyString is Null"); 
       return _myString; 
      } 
     } 

     public MyClass(string myString) 
     { 
      _myString = myString; 
     } 

    } 

} 
+0

+1। अब इसे देख रहे हैं। –

+0

आप अपनी तुलना विधि में शून्य की जांच क्यों नहीं करते? यह बेहतर होगा, मैं सोच रहा हूं, फिर ढांचे को अपवाद फेंकने की अनुमति देता हूं। –

+0

क्योंकि मैं अपने अपवाद हैंडलर को बुलबुला करना चाहता हूं, जहां इसे संभाला जाता है। – PostMan

उत्तर

3

वहाँ एक आज़माएं/कैच ब्लॉक दौर Sort विधि है, हाँ - और उस कैच ब्लॉक अपवाद फैल जाती है। दूसरे शब्दों में, Sort एक अपवाद फेंकता है और आपका कैच ब्लॉक इसे पकड़ता है। यह Main से बाहर प्रचारित नहीं करता है - तो "हो गया!" मुद्रित है

यह वही है जो मैं अपेक्षा करता हूं। आपके अनुभव में यह किस तरह से "अनचाहे" है? क्या आप Sort अपवाद फेंकने की उम्मीद नहीं कर रहे थे? इसे दो तत्वों की तुलना करने में विफलता को इंगित करने के लिए कुछ करने की आवश्यकता है, और यह कार्रवाई का सबसे उपयुक्त तरीका प्रतीत होता है।

आपके यूनिट परीक्षण किस तरह से विफल रहे हैं? क्या आप जानबूझ कर उन्हें अमान्य डेटा दे रहे हैं? आप अपने तुलना कोड को अमान्य डेटा पर प्रतिक्रिया कैसे देना चाहते हैं? अगर इसे अनदेखा करना चाहिए (और किसी अन्य संपत्ति के आधार पर तुलना वापस करना चाहिए), तो आपको अपवाद प्रसार को छोड़ने के बजाय सक्रिय रूप से संपत्ति की जांच करनी चाहिए। ज्यादातर मामलों में मैं अपवाद की अनुमति देता हूं अगर यह इंगित करता है कि पहले एक बग है।

संपादित करें: आपकी अन्य टिप्पणियों के आधार पर, ऐसा लगता है कि आप उचित चीज कर रहे हैं, अपवाद बबल को अपनाने दें - लेकिन यह स्पष्ट नहीं है कि आप अपवाद को किस तरह से देख रहे हैं।

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

संपादित करें: हाँ, Sort अपवाद को पकड़ लेगा और इसके बजाय InvalidOperationException फेंक देगा - लेकिन आप मूल अप को पकड़ने के लिए उस अपवाद की InnerException संपत्ति का उपयोग कर सकते हैं। यह दुर्भाग्यपूर्ण है कि documentation यह निर्दिष्ट नहीं करता है :(

+0

संपादन पर एक नज़र डालें, मेरे डेटाएक्सप्शन को सॉर्ट के अंदर संभाला जा रहा है, और एक अमान्यऑपरेशन एक्सेप्शन सॉर्ट विधि से फेंक दिया गया है। – PostMan

+0

वैसे भी आंतरिक अपवाद के आधार पर पकड़ने के लिए? अगर मुझे अमान्यऑपरेशन एक्सेप्शन – PostMan

-1

मुझे लगता है कि आप नेट फ्रेमवर्क 4.0 के साथ काम करते हैं।नई बात यह है कि एक NullRefenrenceException अब और नहीं पकड़ा जा सकता है (OutOfMemory अपवाद के समान)।

+0

के लिए एक और अपवाद हैंडलर जोड़ना है तो यह एक कोड गंध होगा, यह बिल्कुल सही नहीं है। मैंने अभी कोशिश की है, और बिना किसी समस्या के इसे पकड़ने में कामयाब रहा। आपको यह विचार कहाँ से मिला? –

+0

(मैंने अभी ओपी के कोड को .NET 4b2 में परीक्षण किया है और यह बिल्कुल वही व्यवहार करता है।) –

+0

"वही तरीका" जिसका मतलब अपवाद को पकड़ने में असमर्थ है? और क्या? –

0

उदाहरण के लिए, जब यह जांचता है कि स्ट्रिंग "1" शून्य के बराबर नहीं है। लेकिन यह फिर "1" स्ट्रिंग और शून्य => की लंबाई की तुलना करना चाहता है जो असंभव है। एक पूर्ण उदाहरण प्रदान करने के लिए

+0

हां, पोस्टमैन इस बारे में अवगत है - अपवाद को फेंकने के बाद ऐसा होता है जिसमें वह दिलचस्पी लेता है। –

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