Курс языка программирования Raku / Объекты, ввод-вывод и исключения / Исключения / Собственные исключения / Exercises / Слишком большое
Решение: Слишком большое
Вот один из возможных вариантов решения задачи.
Код
class TooBig is Exception {
has $.value;
has $.limit;
method message {
"Value $.value exceeds the limit of $.limit";
}
}
my $limit = 50;
for 30, 99, 60 -> $value {
TooBig.new(value => $value, limit => $limit).throw if $value > $limit;
say "Value $value is within the limit";
CATCH {
when TooBig {
say .message;
say "Try a value up to {.limit}.";
}
}
}🦋 Исходный код можно найти в файле too-big.raku.
Вывод
Value 30 is within the limit
Value 99 exceeds the limit of 50
Try a value up to 50.
Value 60 exceeds the limit of 50
Try a value up to 50.Комментарии
TooBig is Exceptionделает класс бросаемым исключением. Он несёт две порции данных,valueиlimit, а его методmessageвплетает обе в итоговый текст..throwвозбуждает исключение, аwhen TooBigсопоставляет его по типу. Обработчик делает больше, чем печатает сообщение: он читает атрибутlimitпрямо у перехваченного объекта, чтобы дать полезную подсказку. В этом и преимущество собственного исключения перед простой строкой — обработчик получает структурированные данные, с которыми может работать.Исключение бросается только тогда, когда
$value > $limit. Для30исключения нет, тело цикла доходит до своегоsayи печатает, что значение в пределах нормы. Для99и60срабатываетthrow, поэтому тотsayпропускается и дело берёт на себяCATCH. Телоforсамо и есть тот блок, который охраняетCATCH, поэтому перехваченное исключение завершает лишь текущую итерацию — а затем цикл просто переходит к следующему значению.