2013-07-05 8 views
5

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

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

1 

2 

Email: [email protected], correspondance: John, PAM addresses: [email protected], famousPeople: foo, bar, foo 

3 

4 

etc 

समस्या है, केवल दो:

int i = 0; 
foreach (Contact contact in Contact.LoadWithPredicate(getAll)) 
     { 
       -------other code to populate fields--------- 

       i ++; 
       Console.WriteLine(i); 
       //Turn the Enumerables into strings for printing 
       string firstEnumAsString = String.Join(", ", firstEnumerable.ToArray()); 
       string secondEnumAsString = String.Join(", ", secondEnumerable.ToArray()); 

       Console.WriteLine("Email: " + firstString+ ", correspondance: " + secondString+ ", PAM addresses: " + firstEnumAsString+ ", famousPeople: " + secondEnumAsString); 
} 

तो, मेरी उत्पादन, के रूप में जब भी मैं कोड ऊपर चलाने के लिए, मैं इस तरह एक आउटपुट मिलता है:

यहाँ कोड है कि यह करता है कुल (~ 425) में से लोग दिखाते हैं, बाकी रेखाएं केवल संख्याएं हैं। क्या मुझे कम से कम "ईमेल" तार और "पत्राचार" नहीं मिलना चाहिए? ऐसा लगता है जैसे कंसोल बस कुछ भी नहीं करने का फैसला कर रहा है। और मुझे पता है कि कोड को उस तक पहुंचना चाहिए क्योंकि यह कंसोल को कॉल करने से पहले मैं पूर्णांक को प्रिंट करता हूं। राइटलाइन()।

दूसरी तरफ, जब भी मैं दो स्ट्रिंग फ़ील्ड मुद्रित करने के लिए कहता हूं, तो कंसोल सभी 425 उपयोगकर्ताओं के लिए दोनों फ़ील्ड प्रदर्शित करता है, ठीक उसी पूर्णांक के बाद। क्या किसी को पता है कि यहाँ क्या हो रहा है? टीआईए

+0

कंसोल। अगर जो कुछ भी सुन रहा है तो विफल हो सकता है। क्या आपके पास कोई कस्टम श्रोताओं संलग्न हैं या क्या आप इसे कमांड लाइन से चला रहे हैं? –

+0

इसका परीक्षण करने के लिए कोई समय नहीं है, लेकिन कुछ रनटाइम्स में यदि आप शून्य के साथ मिलते हैं, तो अंतिम परिणाम शून्य है। उस चीज़ में कोई भी शून्य जो आप शामिल हो रहे हैं? – MatthewMartin

+0

अपने 'कंसोल। राइटलाइन' लाइन पर एक ब्रेक पॉइंट सेट करें, और जांचें कि सभी चरों में मूल्य हैं? – Shaharyar

उत्तर

4

आपकी टिप्पणियों के आधार पर, मुझे लगता है कि या तो आपके firstEnumerable या secondEnumerable ऑब्जेक्ट्स null हैं। लेकिन चूंकि आपने पोस्ट नहीं किया है कि आप इन ऑब्जेक्ट्स को कैसे प्राप्त करते हैं, मैं पर टिप्पणी नहीं कर सकता क्यों वे null या इसे ठीक करने के तरीके हैं।

यह उन्हें nullप्रविष्टियों शामिल के लिए करने के लिए, या भी पूरी तरह से खाली हो, लेकिन वे खुद को null नहीं किया जा सकता है या यह एक ArgumentNullException फेंक होगा जब आप उन पर .ToArray() फोन ठीक है। यह "मान शून्य नहीं हो सकता है" अपवाद संदेश से मेल खाता है जो आप देख रहे हैं।

कारण यह क्रैश नहीं हो रहा है और कड़ी मेहनत क्यों कर रहा है क्योंकि आप try/catch ब्लॉक के साथ अपने पुनरावृत्ति लूप के अपवादों को निगल रहे हैं (और लॉगिंग?) जो आपके कोड नमूने में पोस्ट नहीं किए गए थे।

foreach (Contact contact in Contact.LoadWithPredicate(getAll)) 
{ 
    try 
    { 
     ... 

     object[] firstEnumerable = null; 
     object[] secondEnumerable = null; 

     //some logic gates here which under some circumstances do not 
     //assign a valid instance to firstEnumerable or secondEnumerable 

     ... 
     Console.WriteLine(i); //this prints every time 

     //Turn the Enumerables into strings for printing 
     string firstEnumAsString = String.Join(", ", firstEnumerable.ToArray()); //exception here 
     string secondEnumAsString = String.Join(", ", secondEnumerable.ToArray()); //or exception here 

     Console.WriteLine("Email: " + firstString+ ", correspondance: " + secondString+ ", PAM addresses: " + firstEnumAsString+ ", famousPeople: " + secondEnumAsString); 
     ... 
    } 
    catch 
    { 
     //maybe some logging? maybe not? 
    } 
} 

यह बाहर i मूल्य हर बार प्रिंट होगा:


मैं अपने वास्तविक कोड अनुमान है कि इस तरह कुछ है। लेकिन जब यह firstEnumAsString या secondEnumAsString बनाने का प्रयास करता है तो यह एक अपवाद फेंकता है और कभी आपके दूसरे Console.WriteLine("Email: " + ...); को हिट करता है जिससे आप जो आउटपुट देख रहे हैं उसका उत्पादन करते हैं। ऐसा नहीं है कि Console.WriteLine असफल रहा है, यह है कि आप इसे पहले स्थान पर कभी नहीं बुला रहे हैं।

2

यदि मान शून्य है, तो केवल लाइन टर्मिनेटर मानक आउटपुट स्ट्रीम पर लिखा जाता है। लाइन टर्मिनेटर के बारे में अधिक जानकारी के लिए, WriteLine() विधि के टिप्पणियां अनुभाग देखें। - Source

उस के शीर्ष पर, यदि मान आप कंसोल के लिए लिखने के लिए कोशिश कर रहे हैं में से एक एक Exception, जैसे निम्नलिखित कोड में फेंक:

private static string SomeVal { get { throw new Exception(); } } 

    Console.WriteLine("Foo"); 
    Console.WriteLine("This throws an exception: " + SomeVal); 

"यह एक अपवाद फेंकता है: "कंसोल को भी लिखा नहीं जाएगा; पूरी स्ट्रिंग को सिर्फ null माना जाता है। मेरे लिए ऐसा लगता है कि वास्तव में आपके कोड में क्या हो रहा है; कंसोल पर लिखने की कोशिश कर रहे मूल्यों में से एक एक अपवाद फेंक रहा है, और इसे कहीं चुपचाप संभाला जाता है। क्या आप इस कोड को एक दमनकारी try/catch खंड में चला रहे हैं?

आप आसानी से पता लगा सकते हैं कि अगर Console.WriteLine या पीछे } पर एक ब्रेकपाइंट डालकर मामला है और firstString, secondString के मूल्यों की जाँच करें और यदि वे अशक्त हो देखते हैं। आप यह भी बता सकते हैं कि आप जिन मानों को लिखने की कोशिश कर रहे हैं उनमें से एक अपवाद फेंक दिया है या नहीं।

इसके अलावा, आपको के साथ तुलना करने के बजाय string.Format(string format, params object[] args) का उपयोग करने पर विचार करना चाहिए। आपके कोड को डीबग करना भी बहुत आसान बनाता है।

+0

धन्यवाद @ एविटास, मैं इसकी सराहना करता हूं। क्या कोई तरीका है कि मैं कंसोल को पूरी स्ट्रिंग नल बनाने के बजाय उन क्षेत्रों में शून्य लिखने के लिए प्राप्त कर सकता हूं? –

+2

@AlexChumbley प्रारूप 'firstString' का उपयोग करें ?? "न्यूल" इसे इसे [नल-कोलेसिंग ऑपरेटर] कहा जाता है (http://msdn.microsoft.com/en-us/library/ms173224.aspx), यदि चर शून्य है तो इसे 'के बाद जो भी हो, उसे बदल देता है? ? '। –

+0

समस्या यह है कि यदि मेरी धारणाएं सही हैं और मान वास्तव में अपवाद फेंकते हैं, तो उनके मान 'शून्य' नहीं होते हैं - उनके पास वास्तव में कोई मूल्य नहीं होता है और 'शून्य' की जांच करते समय, उन्हें निष्पादन के दौरान छोड़ दिया जाएगा। – aevitas

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