Perl Language
例外処理
サーチ…
評価と死亡
これは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
die
が誤った戻り値を持ち、コードブロック全体の戻り値がコードブロックの最後の式の値であるという事実を「乱用する」:
-
$ret
が正常に割り当てられたら、1;
式はeval
コードブロックで最後に起こるものです。したがって、eval
コードブロックには真の値があるため、or do
ブロックor do
ブロックは実行されません。 -
some_function_that_might_die()
がdie
でいる場合、eval
コードブロックで最後に起こるのはdie
です。したがって、eval
コードブロックには偽の値があり、ブロックor do
ブロックが実行されます。 -
or do
ブロックor do
ブロックで最初にやらなければならないことは$@
と読みます。このグローバル変数は、何らかの引数が渡されたときにそれを保持しdie
。|| "Zombie Error"
ガードが一般的ですが、一般的なケースでは不要です。
これは、ダイを呼び出すことによってすべてのコードが失敗するわけではないが、同じ構造を使用することができるため、理解することは重要です。以下を返すデータベース関数を考えてみましょう:
- 成功時に影響を受ける行の数
- クエリが成功しても行が影響を受けていない場合は
'0 but true'
- クエリが成功しなかった場合は
0
。
その場合でも、同じイディオムを使用できますが 、最後の1;
をスキップする必要があります1;
この関数は評価の最後のものでなければなりません。このようなもの:
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
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow