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 i eval . eval kodblocket har således ett verkligt värde, så att or do blocket inte körs.
  • Om some_function_that_might_die() gör die , då det sista som händer i eval kodblock är die . eval kodblocket har således ett falskt värde och or 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 att die . 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