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 codiceevalha quindi un valore vero, quindi il bloccoor donon viene eseguito. - se
some_function_that_might_die()die, l'ultima cosa che accade nel blocco del codiceevalè ildie. Il blocco del codiceevalha quindi un valore falso e il bloccoor doviene 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 -
0se 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