Corso di Raku / Oggetti, input/output ed eccezioni / Eccezioni / Eccezioni personalizzate / Exercises / Un errore per i numeri negativi
Soluzione: Un errore per i numeri negativi
Ecco una possibile soluzione del compito.
Codice
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;🦋 Trova il programma nel file negative-error.raku.
Output
-5 is negative
-10 is negative
in block <unit> at negative-error.raku line 24Commenti
Negative is Exceptionrende la classe sollevabile, e il suo metodomessageusa l’attributonper costruire il testo.checkvalida il proprio input e solleva l’eccezione personalizzata per un numero negativo. L’eccezione esce dachecke arriva alCATCHnel blocco chiamante, dovewhen Negativela riconosce dal tipo e ne stampa il messaggio. Validare l’input e segnalare i valori sbagliati con un’eccezione tipizzata è un uso molto comune e concreto delle eccezioni personalizzate.Le
{ … }attorno alla chiamata ci sono perché un phaserCATCHgestisce le eccezioni sollevate nel proprio blocco contenitore. Il blocco raggruppa il rischiosocheck(-5)insieme alCATCHche lo sorveglia, così l’eccezione sollevata viene intercettata proprio qui e l’esecuzione riprende subito dopo il blocco. Senza avvolgerli in un blocco, ilCATCHsorveglierebbe l’intero programma — e una volta intercettata l’eccezione il programma finirebbe semplicemente, senza alcun punto naturale in cui proseguire.Il conclusivo
Negative.new(n => -10).throwmostra l’altra faccia della cosa. Sta fuori dal blocco, quindi nessuno lo intercetta: l’eccezione si propaga fino in cima e il programma muore, stampando il messaggio e una traccia sull’errore standard e uscendo con uno stato diverso da zero. È questo il destino predefinito di qualunque eccezione non intercettata — ed è esattamente il motivo per cui il primo lancio aveva bisogno di unCATCHper sopravvivere.