Perl Language
Manejo de excepciones
Buscar..
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 el1;
expresión es lo último que sucede en el bloque de códigoeval
. El bloque de códigoeval
tiene un valor verdadero, por lo que el bloqueor do
no se ejecuta. - si
some_function_that_might_die()
die
, entonces lo último que sucede en el bloque de códigoeval
es eldie
. El bloque de códigoeval
tiene un valor falso y el bloqueor 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 paradie
. 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());
$value->update(); # returns false value on fail
} or do { # handles both the die and the 0 return value
my $eval_error = $@ || "Zombie error!";
handle_error($eval_error);
};
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow