Курс Raku / Об’єкти, введення-виведення та винятки / Винятки / Власні винятки / Вправи / Завелике
Розв’язання: Завелике
Ось один із можливих варіантів розв’язання задачі.
Код
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, тож перехоплений виняток завершує лише поточну ітерацію — далі цикл просто переходить до наступного значення.