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 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());
  $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