Cursus Raku / Objecten, in- en uitvoer en excepties / Excepties / Eigen excepties / Exercises / Een fout bij negatieve getallen
Oplossing: Een fout bij negatieve getallen
Hier is een mogelijke oplossing voor de taak.
Code
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;🦋 Je kunt de broncode vinden in het bestand negative-error.raku.
Uitvoer
-5 is negative
-10 is negative
in block <unit> at negative-error.raku line 24Opmerkingen
Negative is Exceptionmaakt de klasse werpbaar, en haar methodemessagegebruikt het attribuutnom de tekst op te bouwen.checkvalideert haar invoer en werpt de eigen exceptie voor een negatief getal. De exceptie reist uitchecknaar deCATCHin het aanroepende blok, waarwhen Negativehaar op type matcht en de melding afdrukt. Invoer valideren en slechte waarden met een getypeerde exceptie signaleren is een heel gebruikelijke, echte toepassing van eigen excepties.De
{ … }om de aanroep staan er omdat eenCATCH-faser de excepties afhandelt die in zijn eigen omvattende blok geworpen worden. Het blok groepeert de riskantecheck(-5)met deCATCHdie haar bewaakt, zodat de geworpen exceptie hier ter plekke gevangen wordt en de uitvoering vlak na het blok hervat. Zonder ze in een blok te wikkelen zou deCATCHin plaats daarvan het hele programma bewaken — en zodra hij de exceptie ving zou het programma eenvoudigweg eindigen, zonder natuurlijke plek om verder te gaan.De laatste
Negative.new(n => -10).throwtoont de andere kant hiervan. Hij staat buiten het blok, dus niets vangt hem: de exceptie plant zich helemaal naar boven voort, en het programma sterft, waarbij het de melding en een backtrace naar de standaardfoutuitvoer schrijft en met een status ongelijk aan nul afsluit. Dat is het standaardlot van elke exceptie die je niet vangt — en precies waarom de eerste worp eenCATCHnodig had om te overleven.