Cursus Raku / Objecten, in- en uitvoer en excepties / Excepties / Eigen excepties / Exercises / Te groot
Oplossing: Te groot
Hier is een mogelijke oplossing voor de taak.
Code
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}.";
}
}
}🦋 Je kunt de broncode vinden in het bestand too-big.raku.
Uitvoer
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.Opmerkingen
TooBig is Exceptionmaakt van de klasse een werpbare exceptie. Ze draagt twee stukken gegevens mee,valueenlimit, en haar methodemessageverweeft beide in de gemelde tekst..throwwerpt de exceptie op, enwhen TooBigmatcht haar op type. De afhandelaar doet meer dan de melding afdrukken: hij leest het attribuutlimitrechtstreeks van het gevangen object om een behulpzame hint te geven. Dat is het voordeel van een eigen exceptie boven een kale string — de afhandelaar krijgt gestructureerde gegevens waarop hij kan reageren.De exceptie wordt alleen geworpen wanneer
$value > $limit. Voor30wordt geen exceptie opgeworpen en loopt de body van de lus door tot haarsay, die afdrukt dat de waarde binnen de limiet ligt. Voor99en60gaat dethrowaf, dus wordt diesayovergeslagen en handelt deCATCHhet in plaats daarvan af. De body van deforis zelf het blok dat deCATCHbewaakt, dus een gevangen exceptie beëindigt alleen de huidige iteratie — de lus gaat daarna eenvoudigweg door naar de volgende waarde.