Perl Language
Obsługa wyjątków
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, to1;
wyrażenie jest ostatnią rzeczą, która dzieje się w bloku kodueval
. Blok kodueval
ma zatem prawdziwą wartość, więc blokor do
nie działa. - jeśli
some_function_that_might_die()
die
, to ostatnią rzeczą, która dzieje się w bloku kodueval
, jestdie
. Blok kodueval
ma zatem wartość false, a blokor 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 nadie
.|| "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