You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Capítulo 25: Manejo de excepciones
Examples
eval y muere
Esta es la forma integrada de lidiar con las "excepciones" sin depender de bibliotecas de terceros
como Try :: Tiny .
my $ret;
eval {
$ret = some_function_that_might_die();
1;
} or do {
my $eval_error = $@ || "Zombie error!";
handle_error($eval_error);
};
# use $ret
"Abusamos" del hecho de que die tiene un valor de retorno falso, y el valor de retorno del bloque
de código global es el valor de la última expresión en el bloque de código:
• si $ret se asigna con éxito, entonces el 1; expresión es lo último que sucede en el bloque de
código eval . El bloque de código eval tiene un valor verdadero, por lo que el bloque or do no
se ejecuta.
• si some_function_that_might_die() die , entonces lo último que sucede en el bloque de código
eval es el die . El bloque de código eval tiene un valor falso y el bloque or do se ejecuta.
• Lo primero que debes hacer en el bloque or do es leer $@ . Esta variable global mantendrá
cualquier argumento que se haya pasado para die . El || "Zombie Error" es popular, pero
innecesario en el caso general.
Esto es importante de entender porque algunos no todos los códigos fallan al llamar a die, pero la
misma estructura puede usarse independientemente. Considere una función de base de datos
que devuelve:
• el número de filas afectadas en el éxito
• '0 but true' si la consulta es exitosa pero no hay filas afectadas
• 0 si la consulta no tuvo éxito.
En ese caso, puede seguir utilizando el mismo idioma, pero hay que saltar a la final 1; , y esta
función tiene que ser lo último en la evaluación. Algo como esto:
eval {
my $value = My::Database::retrieve($my_thing); # dies on fail
$value->set_status("Completed");
$value->set_completed_timestamp(time());
https://riptutorial.com/es/home 68