Perl Language
Undantagshantering
Sök…
eval och dö
Detta är det inbyggda sättet att hantera "undantag" utan att förlita sig på tredjepartsbibliotek som 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
Vi "missbrukar" det faktum att die
har ett falskt returvärde, och returvärdet för det totala kodblocket är värdet på det sista uttrycket i kodblocket:
- om
$ret
tilldelas till framgång, då1;
uttryck är det sista som händer ieval
.eval
kodblocket har således ett verkligt värde, så attor do
blocket inte körs. - Om
some_function_that_might_die()
gördie
, då det sista som händer ieval
kodblock ärdie
.eval
kodblocket har således ett falskt värde ochor do
blocket körs. - Det första du måste göra i
or do
blocket är att läsa$@
. Denna globala variabel kommer att innehålla det argument som fördes för attdie
. Den|| "Zombie Error"
-vakt är populär, men onödigt i allmänhet.
Detta är viktigt att förstå eftersom vissa inte alla koder misslyckas genom att ringa dör, men samma struktur kan användas oavsett. Tänk på en databasfunktion som returnerar:
- antalet rader som påverkas av framgång
-
'0 but true'
om frågan är framgångsrik men inga rader påverkades -
0
om frågan inte lyckades.
I så fall kan du fortfarande använda samma formspråk, men du måste hoppa över den sista 1;
, och den här funktionen måste vara den sista saken i utvärderingen. Något som det här:
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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow