Perl Language
Uitzondering afhandeling
Zoeken…
eval en sterf
Dit is de ingebouwde manier om met "uitzonderingen" om te gaan zonder afhankelijk te zijn van externe bibliotheken zoals 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
We "misbruiken" het feit dat die
een valse retourwaarde heeft, en de retourwaarde van het totale codeblok is de waarde van de laatste uitdrukking in het codeblok:
- als
$ret
succesvol is toegewezen, dan is de1;
expressie is het laatste dat gebeurt in heteval
codeblok. Heteval
codeblok heeft dus een echte waarde, zodat het blokor do
niet wordt uitgevoerd. - als
some_function_that_might_die()
die
, is het laatste wat in heteval
codeblok gebeurt, dedie
. Heteval
codeblok heeft dus een valse waarde en hetor do
blok wordt uitgevoerd. - Het eerste wat je moet doen in het
or do
blok is$@
lezen. Deze globale variabele zal houden wat argument is doorgegeven aandie
. De|| "Zombie Error"
bewaker is populair, maar in het algemeen niet nodig.
Dit is belangrijk om te begrijpen, omdat sommige niet alle code faalt door dobbelsteen aan te roepen, maar dezelfde structuur kan toch worden gebruikt. Overweeg een databasefunctie die retourneert:
- het aantal rijen dat is beïnvloed bij succes
-
'0 but true'
als de zoekopdracht succesvol is maar er geen rijen zijn getroffen -
0
als de zoekopdracht niet is geslaagd.
In dat geval kunt u nog steeds hetzelfde idioom gebruiken, maar u moet de laatste 1;
overslaan 1;
, en deze functie moet het laatste in het eval zijn. Iets zoals dit:
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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow