Perl Language
Ausnahmebehandlung
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
$reterfolgreich zugewiesen wurde, dann die1;Ausdruck ist das Letzte, was imeval-Codeblock passiert. Dereval-Codeblock hat somit einen echten Wert, sodass deror doBlock nicht ausgeführt wird. - Wenn
some_function_that_might_die()die, ist das letzte, was imeval-Codeblock passiert, derdie. Dereval-Codeblock hat somit einen falschen Wert und deror doBlock wird ausgeführt. - Das erste , was Sie in das tun müssen ,
or doBlock 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 -
0wenn 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