サーチ…


評価と死亡

これは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