Szukaj…


ewaluować i umrzeć

Jest to wbudowany sposób radzenia sobie z „wyjątkami” bez polegania na bibliotekach stron trzecich, takich jak 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

„Nadużywamy” fakt, że die ma fałszywą wartość zwracaną, a zwracana wartość całego bloku kodu jest wartością ostatniego wyrażenia w bloku kodu:

  • jeśli $ret jest przypisane do pomyślnie, to 1; wyrażenie jest ostatnią rzeczą, która dzieje się w bloku kodu eval . Blok kodu eval ma zatem prawdziwą wartość, więc blok or do nie działa.
  • jeśli some_function_that_might_die() die , to ostatnią rzeczą, która dzieje się w bloku kodu eval , jest die . Blok kodu eval ma zatem wartość false, a blok or do działa.
  • Pierwszą rzeczą, którą musisz zrobić w bloku or do , jest przeczytanie $@ . Ta zmienna globalna będzie przechowywała każdy argument przekazany na die . || "Zombie Error" jest popularne, ale w ogóle nie jest konieczne.

Jest to ważne, aby zrozumieć, ponieważ niektóre nie wszystkie kody zawodzą przez wywołanie die, ale niezależnie od tego można użyć tej samej struktury. Rozważ funkcję bazy danych, która zwraca:

  • liczba wierszy wpływających na sukces
  • '0 but true' jeśli zapytanie zakończy się powodzeniem, ale nie wpłynęło to na żadne wiersze
  • 0 jeśli zapytanie nie powiodło się.

W takim przypadku można nadal korzystać z tego samego idiomu, ale trzeba przejść ostateczną 1; , i ta funkcja musi być ostatnią rzeczą w eval. Coś takiego:

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow