perl eval 块抛出 execptions 没有错误

perl eval block throwing execptions without error

我正在尝试将一些 DBIX 交易放在 eval 块下,以便进行所有交易或 none 如果中间出现问题。

我有几笔交易是这样完成的,其中 none 给我带来了问题。 None 但是一个:

我建立交易的方式相当棘手,但就其价值而言,这些交易确实有效。如果你愿意,我可以 post 那段代码,但也许 eval 块就足够了:

    eval {
      for (my $sub = 0; $sub < $neuroexam_index; $sub++){
        $transactions{neuroexams}{$sub}->insert;
      }
    } or die $!;

问题是 eval 在我的控制台中显示错误 ([error] Caught exception in pbitdb::Controller::Subjects->add "Died at /home/lioneluranl/svn/pbitdb/pbitdb/script/../lib/pbitdb/Controller/Subjects.pm line 411."),但实际上执行了插入。为什么会这样?

eval {
  for (my $sub = 0; $sub < $neuroexam_index; $sub++){
    $transactions{neuroexams}{$sub}->insert;
  }
  1;  # No exception.
}
  or do {
    # ... Perform rollback here ...
    die("[error] Caught exception in pbitdb::Controller::Subjects->add: $@");
  };

if (!eval {
  for (my $sub = 0; $sub < $neuroexam_index; $sub++){
    $transactions{neuroexams}{$sub}->insert;
  }
  1;  # No exception.
}) {
  # ... Perform rollback here ...
  die("[error] Caught exception in pbitdb::Controller::Subjects->add: $@");
}

三个变化:

    添加
  • 1; 以确保在没有异常时返回真值,以确保 or 的 RHS 未被评估。
  • $@ 中发现捕获的异常,而不是 $!。 ($! 映射到 errno,由 C 库调用和系统调用设置的错误代码。)
  • 捕获异常简单地重新抛出它是没有用的。您似乎想捕获异常以包装异常消息,但您并没有这样做。您还提到了数据库事务,所以我假设您想执行异常回滚。