2010-11-24 13 views
10

क्या सी # फ़िल्टर संकलन का समर्थन करता है? फ़िल्टर कैसे काम करते हैं या वे क्या करते हैं?सी # अपवाद फ़िल्टर?

परावर्तक की तरह के रूप में

try 
{ 
} 
catch(Exception e) when (?) 
{ 
}
+0

आप एक बेहतर परिभाषा या अपने चाहता था के उदाहरण जोड़ सकते हैं पढ़ें फ़िल्टर :) –

+0

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf, # 23.3: –

+2

को कितने अपवादों को संभाला जाता है यह भी देखें: http://stackoverflow.com/questions/181188/सी-समकक्ष-से-vb-net-catch-when –

उत्तर

5

सी # अपवाद फिल्टर का समर्थन नहीं किया वीबी जब तक सी # 6. करता है की तरह एक फिल्टर वे कैसे काम के लिए के रूप में decompiles, देख एरिक Lippert के "Finally" Does Not Mean "Immediately"

सी # 6, अपवाद में शुरू फिल्टर the C# FAQ demonstrates ही समर्थित हैं:

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

parenthesi हैं 'if' के बाद ज़ेड अभिव्यक्ति [अब when] सत्य का मूल्यांकन करती है, कैच ब्लॉक चलाया जाता है, अन्यथा अपवाद जारी रहता है।

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

साइड इफेक्ट्स के लिए अपवाद फ़िल्टर का उपयोग करने के लिए यह "दुरुपयोग" का एक आम और स्वीकार्य रूप भी है; जैसे लॉगिंग। वे अपने पाठ्यक्रम को अवरुद्ध किए बिना "उड़कर" अपवाद का निरीक्षण कर सकते हैं। उन मामलों में, फिल्टर अक्सर एक झूठी लौटने सहायक समारोह जो दुष्प्रभाव कार्यान्वित करने के लिए एक फोन होगा: सी # 6 प्रलेखन के लिए लिंक के लिए Mafii को

private static bool Log(Exception e) { /* log it */ ; return false; } 
… 
try { … } 
catch (Exception e) when (Log(e)) {} 

धन्यवाद।

+0

ठीक है, तो फ़िल्टर मूल रूप से सिर्फ एक कथन है और यदि यह पूरा नहीं हुआ है तो यह इसे पुनर्स्थापित करता है? – Will

+3

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

+0

यह चलने पर भी अलग है। फिल्टर ब्लॉक पकड़ने से पहले चलाते हैं, भले ही उन फ़िल्टरों को कॉलस्टैक में गहरा परिभाषित किया गया हो। –

23

चूंकि सी # 6 अब आप यह कर सकते हैं।

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

यह catch ब्लॉक के भीतर से एक if कथन का उपयोग, अपवाद फिल्टर का उपयोग कर स्टैक नहीं होंगे से अलग है। सी # में

4

अपवाद फिल्टर समर्थन सी # 6 (विजुअल स्टूडियो "Dev14") में पेश किया जाता है:

try 
{ 
    throw new ApplicationException("1"); 
} 
catch (ApplicationException ex) when (ex.Message == "2") 
{ 
    // this one won't execute. 
} 
catch (ApplicationException ex) when (ex.Message == "1") 
{ 
    // this one will execute 
} 
+2

'if' को सी # 6 के अंतिम संस्करण में 'कब' के साथ बदल दिया गया है – Mafii

0

अपवाद को पकड़ने के दौरान, आप अलग तरह से अपवाद को संभालने के लिए तो आप अपवाद फ़िल्टर उपयोग कर सकते हैं चाहते हैं, तो
- वीबी 7.1 के बाद का उपयोग करते समय

1) सी # नमूना के बाद सी # 6.0

- सी # 6.0
के बाद
try 
{ 
    throw new CustomException { Severity = 100 }; 
} 
catch (CustomException ex) when (ex.Severity > 50) 
{ 
    Console.WriteLine("*BING BING* WARNING *BING BING*"); 
} 
catch (CustomException ex) 
{ 
    Console.WriteLine("Whooops!"); 
} 

नोट: इसी क्रम मायने रखती है

2) सी # नमूना से पहले सी # 6,0

try 
{ 
    throw new CustomException { Severity = 100 }; 
} 
catch (CustomException ex) 
{ 
    if (ex.Severity > 50) 
    { 
     Console.WriteLine("*BING BING* WARNING *BING BING*"); 
    } 
    else 
    { 
     Console.WriteLine("Whooops!"); 
    } 
} 

के बाद से कोड के इस टुकड़े पिछले एक के बराबर है ध्यान रखें। मतलब, वे बराबर हैं, है ना?--- "लेकिन कोई वे समान नहीं होते हैं"
नोट: अपवाद फिल्टर स्टैक नहीं है

यह Here अधिक से

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