Курс по 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и60throwсе задейства, така че тозиsayсе прескача и вместо това го обработваCATCH. Самото тяло наforе блокът, койтоCATCHпази, така че прихванатото изключение прекратява само текущата итерация — а после цикълът просто продължава със следващата стойност.