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
$ret
erfolgreich zugewiesen wurde, dann die1;
Ausdruck ist das Letzte, was imeval
-Codeblock passiert. Dereval
-Codeblock hat somit einen echten Wert, sodass deror do
Block 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 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