Курс языка программирования 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Комментарии
Negative is Exceptionделает класс бросаемым, а его методmessageстроит текст на основе атрибутаn.checkпроверяет свой ввод и бросает собственное исключение для отрицательного числа. Исключение выходит изcheckкCATCHв вызывающем блоке, гдеwhen Negativeсопоставляет его по типу и печатает сообщение. Проверка ввода и сигнализация о плохих значениях типизированным исключением — очень частое, вполне реальное применение собственных исключений.Скобки
{ … }вокруг вызова нужны потому, что фазерCATCHобрабатывает исключения, брошенные в своём собственном объемлющем блоке. Блок объединяет рискованныйcheck(-5)и охраняющий егоCATCH, поэтому брошенное исключение перехватывается прямо здесь, а выполнение возобновляется сразу после блока. Без такой обёрткиCATCHохранял бы всю программу — и, раз перехватив исключение, программа просто закончилась бы, потому что продолжать было бы неоткуда.Заключительный
Negative.new(n => -10).throwпоказывает обратную сторону. Он стоит вне блока, поэтому его никто не перехватывает: исключение поднимается до самого верха, и программа умирает, напечатав сообщение и трассировку в стандартный поток ошибок и завершившись с ненулевым кодом. Такова участь по умолчанию для любого неперехваченного исключения — и ровно поэтому первому броску понадобилсяCATCH, чтобы программа уцелела.