Suche…


bewerten und sterben

Dies ist die integrierte Methode, um mit "Ausnahmen" umzugehen, ohne sich auf Bibliotheken von Drittanbietern wie Try :: Tiny zu verlassen .

my $ret;

eval {
  $ret = some_function_that_might_die();
  1;
} or do {
  my $eval_error = $@ || "Zombie error!";
  handle_error($eval_error);
};

# use $ret

Wir "missbrauchen" die Tatsache, dass die einen falschen Rückgabewert hat, und der Rückgabewert des gesamten Codeblocks ist der Wert des letzten Ausdrucks im Codeblock:

  • Wenn $ret erfolgreich zugewiesen wurde, dann die 1; Ausdruck ist das Letzte, was im eval -Codeblock passiert. Der eval -Codeblock hat somit einen echten Wert, sodass der or do Block nicht ausgeführt wird.
  • Wenn some_function_that_might_die() die , ist das letzte, was im eval -Codeblock passiert, der die . Der eval -Codeblock hat somit einen falschen Wert und der or do Block wird ausgeführt.
  • Das erste , was Sie in das tun müssen , or do Block gelesen $@ . Diese globale Variable enthält das Argument, die . Die || "Zombie Error" Guard ist beliebt, aber im allgemeinen Fall unnötig.

Dies ist wichtig zu verstehen, da nicht alle Codes durch Aufruf der Die versagen, die gleiche Struktur jedoch verwendet werden kann. Betrachten Sie eine Datenbankfunktion, die Folgendes zurückgibt:

  • die Anzahl der Zeilen, die bei Erfolg betroffen sind
  • '0 but true' wenn die Abfrage erfolgreich ist, aber keine Zeilen betroffen waren
  • 0 wenn die Abfrage nicht erfolgreich war.

In diesem Fall können Sie immer noch dieselbe Redewendung verwenden, aber Sie müssen die letzte 1; überspringen 1; und diese Funktion muss das Letzte sein, was in der Bewertung ist. Etwas wie das:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow