2008-09-12 11 views
75

कोड की निम्न बिट EOS अपवाद पकड़तापहला मौका अपवाद संदेशों से बचना जब अपवाद सुरक्षित रूप से नियंत्रित किया जाता है

using (var reader = new BinaryReader(httpRequestBodyStream)) { 

    try { 
     while (true) { 
      bodyByteList.Add(reader.ReadByte()); 
     } 
    } catch (EndOfStreamException) { } 
} 

तो क्यों मैं अभी भी अपने कंसोल में प्रथम मौका अपवाद प्राप्त होगा?

प्रकार 'System.IO.EndOfStreamException' का एक पहला मौका अपवाद mscorlib.dll

में हुई वहाँ एक रास्ता इन पहला मौका अपवाद संदेशों को छिपाने के लिए है?

उत्तर

77

"पहली मौका" अपवादों का बिंदु यह है कि आप उन्हें प्री-हैंडलर देख रहे हैं ताकि आप फेंकने के बिंदु पर डीबगिंग के दौरान उन पर रोक सकें। एक "दूसरा मौका" अपवाद वह है जिसके पास कोई उपयुक्त हैंडलर नहीं है। कभी-कभी आप "पहली मौका" अपवादों को पकड़ना चाहते हैं क्योंकि यह देखना महत्वपूर्ण है कि इसे फेंकने पर क्या हो रहा है, भले ही कोई इसे पकड़ रहा हो।

इससे कोई संबंध नहीं है। यह सामान्य व्यवहार है।

+56

वास्तव में, यह चिंतित होने के लिए कुछ भी नहीं है, लेकिन वे डीबग आउटपुट लॉग को अव्यवस्थित करते हैं :( –

-4

मुझे लगता है कि स्ट्रीम इस अपवाद को फेंक रही है, इसलिए आपकी कोशिश इसे पकड़ने के लिए संकीर्ण करने के लिए स्कॉप्ड है।

अलग-अलग क्षेत्रों के चारों ओर पकड़ने के लिए कुछ और प्रयास करें, जब तक कि आप इसे वास्तव में फेंक नहीं देते हैं, लेकिन ऐसा लगता है कि यह आपके उपयोग के बाहर या तो हो रहा है, क्योंकि स्ट्रीम ऑब्जेक्ट का उपयोग करने के दायरे में नहीं बनाया गया है ।

19

1) विजुअल स्टूडियो में आप डीबगर हैंडल (ब्रेक ऑन) अपवादों के तरीके के लिए सेटिंग बदल सकते हैं।

डीबग> अपवादों पर जाएं। (ध्यान दें कि यह आपके विजुअल स्टूडियो एनवायरनमेंट सेटिंग के आधार पर आपके मेनू में नहीं हो सकता है। अगर कस्टमाइज़ मेनू का उपयोग करके इसे अपने मेनू में न जोड़ें।)

वहां आपको अपवादों का एक संवाद प्रस्तुत किया गया है और उन्हें कब तोड़ना है ।

"सामान्य भाषा रनटाइम अपवाद" पंक्ति में आप फेंकने को अचयनित कर सकते हैं (जिसे आपको पहले मौके के अपवादों के बारे में परेशान करना बंद कर देना चाहिए) और यदि आप चाहें तो उपयोगकर्ता-अनचाहे (जिसे मैं अनुशंसा नहीं करता) को अचयनित भी कर सकता हूं।

2) जो संदेश आप प्राप्त कर रहे हैं वह कंसोल में नहीं होना चाहिए, लेकिन विजुअल स्टूडियो की 'आउटपुट' विंडो में दिखना चाहिए। यदि उत्तरार्द्ध मामला है, तो मुझे इसे हटाने की संभावना नहीं मिली है, लेकिन अगर आप विजुअल स्टूडियो के बिना ऐप चलाते हैं तो ऐसा नहीं होता है।

उम्मीद है कि मदद करता है।

10

जावा के विपरीत, प्रसंस्करण शक्ति के मामले में .NET अपवाद काफी महंगा हैं, और सामान्य और सफल निष्पादन पथ में हैंडल अपवादों से बचा जाना चाहिए।

न केवल आप कंसोल विंडो में अव्यवस्था से बचेंगे, लेकिन आपका प्रदर्शन बेहतर होगा, और यह प्रदर्शन काउंटर जैसे .NET CLR अपवादों को और अधिक सार्थक बना देगा।

इस उदाहरण में आप

while (reader.PeekChar() != -1) 
{ 
    bodyByteList.Add(reader.ReadByte()); 
} 
+0

या आप रीडबाइट्स के साथ एक शॉट में सभी बाइट्स प्राप्त कर सकते हैं और बफरिंग का भी उपयोग कर सकते हैं। लेकिन मुझे लगता है कि ' प्रश्न। –

+4

प्रश्न का उत्तर नहीं देता –

+9

निश्चित रूप से यह करता है। "क्या इन पहले मौके अपवाद संदेशों को छिपाने का कोई तरीका है?" - इस लूप के साथ पहला मौका अपवाद नहीं दिखाई देगा। :) – loudej

189

का उपयोग संदेशों को देखने से बचने के लिए होता है, उत्पादन खिड़की पर राइट क्लिक करें और सही का निशान हटाएँ "अपवाद संदेश"।

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

+7

सही नाम " अपवाद संदेश "। प्रश्न के दूसरे छमाही का जवाब देने के लिए धन्यवाद। – StriplingWarrior

-1
VB.NET में

:

<DebuggerHidden()> _ 
Public Function Write(ByVal Text As String) As Boolean 
    ... 
+1

इस प्रश्न के साथ इसका कोई लेना-देना नहीं है। –

+0

असल में, [डीबगर नॉनयूसर कोड] * का उपयोग करके * छुपाएं "पहला मौका अपवाद" संदेश। मैं आश्चर्यचकित नहीं होगा DebuggerHidden यह भी करता है। – Ruben

+0

मुझे यकीन नहीं है कि इन्हें अपवाद माना जाता है, लेकिन [DebuggerNonUserCode] "प्रबंधित डीबगिंग सहायक" में से कोई भी छिप नहीं पाएगा। उदाहरण के लिए, जब मैं XmlSerializer का उपयोग करता हूं, तो मुझे बाध्यकारी विफलता मिलती है, और अपवाद संवाद से फेंकने पर बाध्यकारी विफलता को अनचेक करने के अलावा, मुझे इसे छिपाने का कोई तरीका नहीं मिला है। –

2

असल में प्रति सेकंड कई अपवाद कर रहे हैं, आप की जाँच reader.EndOfStream-मूल्य से होगा बेहतर प्रदर्शन .. प्राप्त होगा उन अपवाद संदेशों अविश्वसनीय है धीमी गति से बाहर मुद्रण, और दृश्य स्टूडियो में उन्हें छिपाने से कुछ भी तेज नहीं होगा।

7

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

  1. नेविगेट करें "डीबग/अपवाद"
  2. "साझा भाषा क्रम अपवाद" पेड़ का विस्तार करने के लिए।
  3. "सिस्टम" शाखा का विस्तार करें।
  4. "NullReferenceException" कहां स्क्रॉल करें, और "फेंक दें" चेकबॉक्स को चेक करें, और "उपयोगकर्ता-प्रबंधित" अनचेक करें।
  5. अपनी परियोजना डीबग करें।
4

आप इन संदेशों पर अधिक नियंत्रण चाहते हैं, तो आप एक हैंडलर जोड़ सकते हैं:

Friend Sub AddTheHandler() 
AddHandler AppDomain.CurrentDomain.FirstChanceException, AddressOf FirstChanceExceptionHandler 
End Sub 

<Conditional("DEBUG")> 
Friend Sub FirstChanceExceptionHandler(source As Object, e As Runtime.ExceptionServices.FirstChanceExceptionEventArgs) 
' Process first chance exception 

End Sub 

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

+1

अच्छा सुझाव। लेकिन यह ध्यान देने योग्य है कि System.Runtime.ExceptionServices केवल .Net 4.0 या उच्चतर में उपलब्ध है। हममें से उन लोगों के लिए नेट 3.5 (या पुराने) के खिलाफ लिखे गए विरासत कोड से निपटने के लिए। – paulsm4

+0

*** एएसपी.NET *** के लिए मान्य है? – Kiquenet

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