Курс Raku / Об’єкти, введення-виведення та винятки / Винятки / Власні винятки / Вправи / Помилка від’ємного числа

Розв’язання: Помилка від’ємного числа

Ось один із можливих варіантів розв’язання задачі.

Код

class Negative is Exception {
    has $.n;

    method message {
        "$.n is negative";
    }
}

sub check($n) {
    Negative.new(n => $n).throw if $n < 0;
    return $n;
}

{
    say check(-5);

    CATCH {
        when Negative {
            say .message;
        }
    }
}

Negative.new(n => -10).throw;

🦋 Вихідний код можна знайти у файлі negative-error.raku.

Вивід

-5 is negative
-10 is negative
  in block <unit> at negative-error.raku line 24

Коментарі

  1. Negative is Exception робить клас придатним для кидання, а його метод message використовує атрибут n, щоб побудувати текст.

  2. check перевіряє свій ввід і кидає власний виняток для від’ємного числа. Виняток мандрує з check до CATCH у блоці, що викликав, де when Negative зіставляється з ним за типом і виводить повідомлення. Перевірка вводу й сигналізування про погані значення типізованим винятком є дуже поширеним, справжнім застосуванням власних винятків.

  3. Дужки { … } навколо виклику потрібні тому, що фазер CATCH обробляє винятки, кинуті в його власному обгортальному блоці. Блок групує ризикований check(-5) разом із CATCH, який його охороняє, тож кинутий виняток перехоплюється саме тут, і виконання відновлюється одразу після блоку. Без загортання їх у блок CATCH охороняв би натомість усю програму — і, перехопивши виняток, програма просто завершилася б, не маючи природного місця, щоб продовжити.

  4. Останній Negative.new(n => -10).throw показує зворотний бік. Він стоїть поза блоком, тож його ніхто не перехоплює: виняток поширюється аж до верху, і програма гине, виводячи повідомлення й трасування стека до стандартного потоку помилок і завершуючись із ненульовим статусом. Така типова доля будь-якого неперехопленого винятку — і саме тому першому киданню потрібен був CATCH, щоб вижити.

Навігація курсом

Помилка від’ємного числа   |   Два типи винятків