Perl Language
La gestione delle eccezioni
Ricerca…
eval e muori
Questo è il modo integrato di gestire le "eccezioni" senza fare affidamento su librerie di terze parti come 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
Noi "abusiamo" del fatto che il die
ha un valore di ritorno falso, e il valore di ritorno del blocco di codice complessivo è il valore dell'ultima espressione nel blocco di codice:
- se
$ret
è assegnato correttamente, allora il1;
espressione è l'ultima cosa che accade nel blocco del codiceeval
. Il blocco del codiceeval
ha quindi un valore vero, quindi il bloccoor do
non viene eseguito. - se
some_function_that_might_die()
die
, l'ultima cosa che accade nel blocco del codiceeval
è ildie
. Il blocco del codiceeval
ha quindi un valore falso e il bloccoor do
viene eseguito. - La prima cosa che devi fare nel blocco
or do
è leggere$@
. Questa variabile globale terrà qualunque argomento sia passato perdie
.|| "Zombie Error"
guardia|| "Zombie Error"
è popolare, ma non necessaria nel caso generale.
Questo è importante per capire perché alcuni non tutti i codici falliscono chiamando die, ma la stessa struttura può essere usata a prescindere. Si consideri una funzione del database che restituisce:
- il numero di righe interessate al successo
-
'0 but true'
se la query ha esito positivo, ma nessuna riga è stata interessata -
0
se la query non ha avuto successo.
In questo caso è comunque possibile utilizzare lo stesso linguaggio, ma si deve saltare la finale 1;
e questa funzione deve essere l'ultima cosa nella valutazione. Qualcosa come questo:
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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow