کلیدواژهی فیلتر کردن استثناها 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.Multiply() از نمونهی Calculatorی که به سازنده پاس داده شده است را فراخوانی کند و مقادیر صحیح 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