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 de 1; expressie is het laatste dat gebeurt in het eval codeblok. Het eval codeblok heeft dus een echte waarde, zodat het blok or do niet wordt uitgevoerd.
  • als some_function_that_might_die() die , is het laatste wat in het eval codeblok gebeurt, de die . Het eval codeblok heeft dus een valse waarde en het or 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 aan die . 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