when - це ключове слово для фільтрування винятків. Його розміщують після інструкції catch, і воно може приймати булевий вираз (англ. Boolean), що містить будь-які значення, доступні в області видимості на той момент. Якщо вираз обчислюється як правда, то виконується блок, повʼязаний із цією інструкцією 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
Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.