Raku kurss / Objekti, ievade/izvade un izņēmumi / Izņēmumi / Paša veidoti izņēmumi / Exercises / Negatīva skaitļa kļūda
Risinājums: Negatīva skaitļa kļūda
Šeit ir iespējams risinājums uzdevumam.
Kods
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;🦋 Atrodiet programmu failā negative-error.raku.
Izvade
-5 is negative
-10 is negative
in block <unit> at negative-error.raku line 24Komentāri
Negative is Exceptionpadara klasi izmetamu, un tās metodemessageizmanto atribūtun, lai uzbūvētu tekstu.checkpārbauda savu ievadi un negatīvam skaitlim izmet paša definēto izņēmumu. Izņēmums izceļo nochecklīdzCATCHizsaucošajā blokā, kurwhen Negativetam atbilst pēc tipa un izdrukā paziņojumu. Ievades pārbaude un sliktu vērtību signalizēšana ar tipizētu izņēmumu ir ļoti izplatīts, īsts paša definētu izņēmumu lietojums.{ … }ap izsaukumu ir tur tāpēc, ka fāzerisCATCHapstrādā izņēmumus, kas izmesti tā paša apņemošajā blokā. Bloks sagrupē riskantocheck(-5)kopā arCATCH, kas to sargā, tāpēc izmestais izņēmums tiek noķerts turpat, un izpilde atsākas tūlīt aiz bloka. Neietinot tos blokā,CATCHsargātu visu programmu — un, tiklīdz tas izņēmumu noķertu, programma vienkārši beigtos, bez dabiskas vietas, kur turpināt.Nobeiguma
Negative.new(n => -10).throwparāda otru šīs medaļas pusi. Tas atrodas ārpus bloka, tāpēc to nenoķer nekas: izņēmums izplatās līdz pašai augšai, un programma mirst, izdrukājot paziņojumu un izsaukumu atskaiti standarta kļūdu plūsmā un izejot ar nenulles statusu. Tāds ir noklusētais liktenis jebkuram izņēmumam, ko nenoķerat, — un tieši tāpēc pirmajam izmetienam bija vajadzīgsCATCH, lai izdzīvotu.