Kurso de Raku / Objektoj, en- kaj eligo kaj escepto / Esceptoj / Propraj esceptoj / Exercises / Eraro pri negativa nombro
Solvo: Eraro pri negativa nombro
Jen ebla solvo de la tasko.
Kodo
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;🦋 Vi povas trovi la fontkodon en la dosiero negative-error.raku.
Eligo
-5 is negative
-10 is negative
in block <unit> at negative-error.raku line 24Komentoj
Negative is Exceptionfaras la klason ĵetebla, kaj ĝia metodomessageuzas la atributonnpor konstrui la tekston.checkvalidigas sian enigon kaj ĵetas la propran escepton por negativa nombro. La escepto vojaĝas elcheckal laCATCHen la vokanta bloko, kiewhen Negativekongruas kun ĝi laŭ tipo kaj presas la mesaĝon. Validigi enigon kaj signali malbonajn valorojn per tipita escepto estas tre ofta, vera uzo de propraj esceptoj.La
{ … }ĉirkaŭ la voko estas tie, ĉar fazeroCATCHtraktas la esceptojn ĵetitajn en sia propra ĉirkaŭa bloko. La bloko grupigas la riskancheck(-5)kune kun laCATCH, kiu gardas ĝin, do la ĵetita escepto estas kaptata ĝuste ĉi tie, kaj la ekzekuto rekomenciĝas tuj post la bloko. Sen envolvi ilin en blokon, laCATCHgardus la tutan programon anstataŭe — kaj post kiam ĝi kaptus la escepton, la programo simple finiĝus, kun neniu natura loko por daŭrigi.La fina
Negative.new(n => -10).throwmontras la alian flankon de tio. Ĝi sidas ekster la bloko, do nenio kaptas ĝin: la escepto disvastiĝas ĝis la supro, kaj la programo mortas, presante la mesaĝon kaj retrospuron al norma erarfluo kaj elirante kun ne-nula statuso. Jen la defaŭlta sorto de ĉiu escepto, kiun vi ne kaptas — kaj ĝuste kial la unua ĵeto bezonisCATCHpor postvivi.