Curso de Raku / Objetos, entrada/salida y excepciones / Excepciones / Excepciones propias / Exercises / Un error de número negativo
Solución: Un error de número negativo
Aquí tienes una posible solución para la tarea.
Código
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;🦋 Puedes encontrar el código fuente en el archivo negative-error.raku.
Salida
-5 is negative
-10 is negative
in block <unit> at negative-error.raku line 24Comentarios
Negative is Exceptionhace lanzable la clase, y su métodomessageusa el atributonpara construir el texto.checkvalida su entrada y lanza la excepción personalizada para un número negativo. La excepción sale dechecky llega alCATCHdel bloque que llama, dondewhen Negativela empareja por tipo e imprime el mensaje. Validar la entrada y señalar los valores erróneos con una excepción tipada es un uso muy común y real de las excepciones personalizadas.Las
{ … }alrededor de la llamada están ahí porque un phaserCATCHmaneja las excepciones lanzadas en su propio bloque contenedor. El bloque agrupa el arriesgadocheck(-5)junto con elCATCHque lo vigila, de modo que la excepción lanzada se captura justo aquí y la ejecución se reanuda inmediatamente después del bloque. Sin envolverlos en un bloque, elCATCHvigilaría el programa entero, y una vez capturada la excepción el programa simplemente terminaría, sin ningún punto natural en el que seguir.El
Negative.new(n => -10).throwfinal muestra la otra cara. Está fuera del bloque, así que nada lo captura: la excepción se propaga hasta arriba del todo y el programa muere, imprimiendo el mensaje y una traza en el error estándar y saliendo con un estado distinto de cero. Ese es el destino por omisión de cualquier excepción que no captures, y exactamente el motivo por el que el primer lanzamiento necesitaba unCATCHpara sobrevivir.