15.03.2020 Views

perl-language-es

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!