2008-10-08 15 views
13

VB.NET में मैं अक्सर Catch…When:सी # VB.NET के पकड़ने के बराबर ... जब

Try 
    … 
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES" 
    … 
End Try 

वहाँ Catch…When करने के लिए एक सी # बराबर है?

यदि संभव हो तो catch के अंदर if कथन का उपयोग करना नहीं चाहता हूं।

+0

चेक यह पेज http://stackoverflow.com/questions/4269189/c-exception-monitor-with-filtering;) – Edward83

उत्तर

12

इस कार्यशीलता के लिए सी # 6. घोषणा की गई थी अब यह

try { … } 
catch (MyException e) when (myfilter(e)) 
{ 
    … 
} 

लिखने के लिए यह तो आपको देखना, या आधिकारिक रिलीज के लिए प्रतीक्षा करने Visual Studio 2015 अब का पूर्वावलोकन डाउनलोड कर सकते हैं संभव है।

15

सी # में Catch…When के बराबर नहीं है। आप वास्तव में अपने catch के अंदर एक if बयान का सहारा है, तो rethrow के लिए अगर अपनी हालत को पूरा नहीं है होगा:

try 
{ 
    … 
} 
catch (ArgumentNullException e) 
{ 
    if ("SAMPLES" == e.ParamName.ToUpper()) 
    { 
     … // handle exception 
    } 
    else 
    { 
     throw; // condition not fulfilled, let someone else handle the exception 
    } 
} 
+2

मैं cruizer और निकोलस Mancuso साथ हूँ, बस 'थ्रो' का उपयोग कर ढेर [गलती को बरकरार रखता है प्रत्येक सी # प्रोग्रामर बनाता है] (http://msmvps.com/blogs/nickwienholt/archive/2006/07/04/103778.aspx "गलती हर सी # प्रोग्रामर बनाता है") – bob31334

+0

@ bob31334 केवल अपवाद वस्तु में कब्जा कर लिया गया ढेर, हालांकि कार्यक्रम की स्थिति को पहले से ही संशोधित कर दिया गया है और मूल ढेर नष्ट हो गया है, और आखिरकार ब्लॉक पहले ही निष्पादित किए गए हैं (दूसरे शब्दों में जब फ़िल्टर कैच स्टेटमेंट स्तर पर चलता है और हैंडलर में नहीं, यह Win32 एपीआई में एसईएच के समान है) –

12

कि वीबी पकड़ने के रूप में ही अर्थ विज्ञान जब अभिव्यक्ति पुन: नहीं होंगे। एक महत्वपूर्ण अंतर है। वीबी जब स्टैक खोलने से पहले अभिव्यक्ति निष्पादित की जाती है। यदि आप फ़िल्टर के बिंदु पर ढेर की जांच करना चाहते थे, तो आप वास्तव में उस फ्रेम को देखेंगे जहां अपवाद फेंक दिया गया था।

कैच ब्लॉक में एक होने के कारण अलग है क्योंकि स्टैक के बाद कैच ब्लॉक निष्पादित होता है। जब त्रुटि रिपोर्टिंग की बात आती है तो यह विशेष रूप से महत्वपूर्ण होता है। वीबी परिदृश्य में आपके पास विफलता सहित एक स्टैक ट्रेस के साथ दुर्घटनाग्रस्त होने की क्षमता है। सी # में उस व्यवहार को प्राप्त करना संभव नहीं है।

संपादित करें:

विषय पर एक detailed blog post लिखा।

+0

क्या आपको यकीन है? आप बस 'फेंक' का उपयोग कर सकते हैं 'फेंक ई' के बजाय –

+0

100% इसमें फेंकने के लिए कुछ भी नहीं है। यह तब होता है जब अभिव्यक्ति द्वारा निष्पादित अभिव्यक्ति को निष्पादित किया जाता है। वीबी में यह तब होगा जब अपवाद वृद्धि बिंदु अभी भी ढेर पर है। – JaredPar

+0

सी # में, भले ही स्टैक ऑफ़लोड हो गया हो - अपवाद ऑब्जेक्ट 'ई' में अभी भी स्टैक ट्रेस उपलब्ध है। लेकिन संभवतया यह सहायक नहीं है कि पूरे स्टैक को डीबग समय पर उपलब्ध कराया जा सके। लेकिन रनटाइम लॉगजिन जानकारी के लिए स्टैक ट्रेस पर्याप्त होगा? – dotnetcoder