क्या सी # फ़िल्टर संकलन का समर्थन करता है? फ़िल्टर कैसे काम करते हैं या वे क्या करते हैं?सी # अपवाद फ़िल्टर?
परावर्तक की तरह के रूप में
try { } catch(Exception e) when (?) { }
क्या सी # फ़िल्टर संकलन का समर्थन करता है? फ़िल्टर कैसे काम करते हैं या वे क्या करते हैं?सी # अपवाद फ़िल्टर?
परावर्तक की तरह के रूप में
try { } catch(Exception e) when (?) { }
सी # अपवाद फिल्टर का समर्थन नहीं किया वीबी जब तक सी # 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)) {}
धन्यवाद।
ठीक है, तो फ़िल्टर मूल रूप से सिर्फ एक कथन है और यदि यह पूरा नहीं हुआ है तो यह इसे पुनर्स्थापित करता है? – Will
कोई वास्तविक फ़िल्टर अलग नहीं है क्योंकि वास्तविक फिल्टर इसे अपवाद को संभालने का निर्णय लेता है, जबकि एक कैचराउंड होता है और इसे फिर से फेंकता है। इसमें स्टैक-अनोलिंग से संबंधित थोड़ा अलग अर्थशास्त्र है। – CodesInChaos
यह चलने पर भी अलग है। फिल्टर ब्लॉक पकड़ने से पहले चलाते हैं, भले ही उन फ़िल्टरों को कॉलस्टैक में गहरा परिभाषित किया गया हो। –
चूंकि सी # 6 अब आप यह कर सकते हैं।
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
यह catch
ब्लॉक के भीतर से एक if
कथन का उपयोग, अपवाद फिल्टर का उपयोग कर स्टैक नहीं होंगे से अलग है। सी # में
अपवाद फिल्टर समर्थन सी # 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
}
'if' को सी # 6 के अंतिम संस्करण में 'कब' के साथ बदल दिया गया है – Mafii
अपवाद को पकड़ने के दौरान, आप अलग तरह से अपवाद को संभालने के लिए तो आप अपवाद फ़िल्टर उपयोग कर सकते हैं चाहते हैं, तो
- वीबी 7.1 के बाद का उपयोग करते समय
1) सी # नमूना के बाद सी # 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 अधिक से
आप एक बेहतर परिभाषा या अपने चाहता था के उदाहरण जोड़ सकते हैं पढ़ें फ़िल्टर :) –
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf, # 23.3: –
को कितने अपवादों को संभाला जाता है यह भी देखें: http://stackoverflow.com/questions/181188/सी-समकक्ष-से-vb-net-catch-when –