Курс языка программирования Raku / Объекты, ввод-вывод и исключения / Исключения / Собственные исключения / Exercises / Ошибка отрицательного числа

Решение: Ошибка отрицательного числа

Вот один из возможных вариантов решения задачи.

Код

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, чтобы программа уцелела.

Навигация по курсу

Ошибка отрицательного числа   |   Два типа исключений