perl eval块无错误地抛出execptions

时间:2017-01-27 18:25:44

标签: perl eval catalyst dbix-class

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

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

我构建交易的方式相当棘手,而且值得的是,这些实际上是有效的。如果你愿意,我可以发布那段代码,但也许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."),但实际上是执行插入操作。为什么会这样?

1 个答案:

答案 0 :(得分: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: $@");
  };

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库调用和系统调用设置的错误代码。)
  • 捕获异常以简单地重新抛出它无用。您似乎想要捕获异常以包装异常消息,但您没有这样做。您还提到了数据库事务,因此我假设您要对异常执行回滚。