perl eval块无错误地抛出execptions

Lio*_*uru 2 perl eval catalyst dbix-class

我试图在一个eval块下放置一些DBIX事务来进行所有事务,如果中间出现问题则不进行.

我有几个交易正在这样做,没有一个给我带来问题.只有一个:

我构建交易的方式相当棘手,而且值得的是,这些实际上是有效的.如果你愿意,我可以发布那段代码,但也许eval块就足够了:

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

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

ike*_*ami 9

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: $@");
  };
Run Code Online (Sandbox Code Playgroud)

要么

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: $@");
}
Run Code Online (Sandbox Code Playgroud)

三个变化:

  • 1;添加以确保在没有异常时返回真值,以确保or未评估RHS .
  • 捕获的异常是在$@,而不是$!.($!映射到errnoC库调用和系统调用设置的错误代码.)
  • 捕获异常只是重新抛出它无用.您似乎想要捕获异常以包装异常消息,但您没有这样做.您还提到了数据库事务,因此我假设您要对异常执行回滚.

  • 如果块中较早发生异常,则不会达到"1". (4认同)
  • @stevieb,他们是等价的. (4认同)