when कीवर्ड एक्सेप्शन फिल्टर करने के लिए इस्तेमाल होता है। यह catch स्टेटमेंट के बाद लिखा जाता है और इसमें कोई भी बूलियन एक्सप्रेशन दे सकते हैं, जिसमें उस समय स्कोप में मौजूद कोई भी वैल्यू शामिल हो सकती है। अगर एक्सप्रेशन का मान सही होता है, तो उस catch स्टेटमेंट से जुड़ा ब्लॉक चलाया जाता है, वरना अगला catch स्टेटमेंट (अगर कोई हो) जाँचा जाता है।
try
{
// do stuff
}
catch (Exception ex) when (ex.Message != "")
{
// output the message when it is not empty
}
catch (Exception ex)
{
// show stack trace or something.
}
उपयोगकर्ता द्वारा बनाया गया एक्सेप्शन वह क्लास होती है जिसे आप अपने कोड में बनाते हैं और जो System.Exception से बनी होती है। ऐसी क्लास पर क्लास इनहेरिटेंस के सारे नियम लागू होते हैं। इसके अलावा कंपाइलर और भाषा का रनटाइम ऐसी क्लासों के साथ एक खास तरीके से व्यवहार करते हैं, जिससे उनके इंस्टेंस को सामान्य कंट्रोल फ्लो से बाहर भी थ्रो और कैच किया जा सकता है, जैसा कि exceptions अभ्यास में बताया गया है।
उपयोगकर्ता द्वारा बनाए गए एक्सेप्शन अक्सर अतिरिक्त जानकारी ले जाने के लिए इस्तेमाल होते हैं, जैसे कोई संदेश और दूसरा ज़रूरी डेटा, ताकि कैच करने वाले कोड को यह जानकारी उपलब्ध हो सके।
Instruments of Texas में काम करते हुए आपको C# में लिखे एक प्रयोगात्मक कैल्कुलेटर पर काम करने की ज़िम्मेदारी दी गई है। आप गुणा से शुरू करके कैल्कुलेटर के कई फंक्शन जाँचने के लिए एक टेस्ट हार्नेस बना रहे हैं। आप देखेंगे कि जब गुणा के दोनों ऑपरेंड ऋणात्मक हों, तो विशेष ध्यान देने की ज़रूरत पड़ती है।
Calculator क्लास आपको पहले ही दी जा चुकी है और उसमें बदलाव नहीं करना है।
CalculationException की परिभाषा पूरी कीजिएCalculationException के कंस्ट्रक्टर की परिभाषा पूरी कीजिए। इसमें कैल्कुलेटर द्वारा फेंकी गई किसी भी एक्सेप्शन को, और साथ ही उन ऑपरेंड को भी संग्रहीत (रैप) करना होगा जो एक्सेप्शन फेंके जाने के समय प्रोसेस हो रहे हों।
CalculatorTestHarness.Multiply() मेथड लागू कीजिए। इसे कंस्ट्रक्टर को दिए गए Calculator इंस्टेंस के Calculator.Multiply() मेथड को कॉल करना चाहिए और उसमें x तथा y पूर्णांक वैल्यू पास करनी चाहिए। अगर Calculator.Multiply() मेथड में ओवरफ्लो होता है, तो यह एक OverflowException फेंकता है। इस एक्सेप्शन को CalculatorTestHarness.Multiply() मेथड में पकड़कर CalculationException में रैप करना चाहिए, और जो x तथा y वैल्यू पास की जा रही हैं उन्हें एक्सेप्शन के ऑपरेंड के रूप में संग्रहीत करना चाहिए। नए बनाए गए CalculationException ऑब्जेक्ट को फेंकना चाहिए। अगर Calculator.Multiply() मेथड सफल होता है, तो उससे लौटाई गई वैल्यू को आप अनदेखा कर सकते हैं।
var cth = new CalculatorTestHarness(new Calculator());
cth.Multiply(Int32.MaxValue, Int32.MaxValue);
// => throws an instance of CalculationException
var cth2 = new CalculatorTestHarness(new Calculator());
cth2.Multiply(3, 2);
// => silently exits
CalculatorTestHarness.TestMultiplication() मेथड लागू कीजिए, जो दो पूर्णांक लेता है और CalculatorTestHarness.Multiply() मेथड को कॉल करता है। तब "Multiply succeeded" लौटाया जाता है।
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(6, 7);
// => "Multiply succeeded"
CalculatorTestHarness.TestMultiplication() मेथड में बदलाव कीजिए, ताकि अगर दोनों पूर्णांक आर्गुमेंट ऋणात्मक (शून्य से कम) हों, तो "Multiply failed for negative operands. <INNER_EXCEPTION_MESSAGE>" लौटाया जाए।
<INNER_EXCEPTION_MESSAGE> प्लेसहोल्डर की जगह CalculationException की इनर एक्सेप्शन का संदेश रखा जाना चाहिए।
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(-2, -Int32.MaxValue);
// => "Multiply failed for negative operands. " + innerException.Message
CalculatorTestHarness.TestMultiplication() मेथड में बदलाव कीजिए, ताकि अगर पूर्णांक आर्गुमेंट में से कम से कम एक ऋणात्मक न हो, तो "Multiply failed for mixed or positive operands. <INNER_EXCEPTION_MESSAGE>" लौटाया जाए।
<INNER_EXCEPTION_MESSAGE> प्लेसहोल्डर की जगह CalculationException की इनर एक्सेप्शन का संदेश रखा जाना चाहिए।
var cth = new CalculatorTestHarness(new Calculator());
cth.TestMultiplication(Int32.MaxValue, Int32.MaxValue);
// => "Multiply failed for mixed or positive operands. " + innerException.Message
Exercism पर साइन अप कीजिए और C# को 62 कॉन्सेप्ट178 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।