perl eval block 抛出 execptions 没有错误

标签 perl eval catalyst dbix-class

我正在尝试将一些 DBIX 事务置于 eval block 下,以便要么进行所有事务,要么在中间出现问题时不进行任何事务。

我有几笔交易是这样完成的,但没有一件给我带来问题。只有一个:

我构建交易的方式相当棘手,但就其值(value)而言,这些交易确实有效。如果你愿意,我可以发布那段代码,但也许 eval block 就足够了:

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

问题是 eval 显示错误([error] 在 pbitdb::Controller::Subjects->add "Died at/home/lioneluranl/svn/pbitdb/pbitdb/script/. ./lib/pbitdb/Controller/Subjects.pm 第 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; 以确保在没有异常时返回真值,以确保不评估 的 RHS。
  • 捕获的异常是在$@ 中找到的,而不是$!。 ($! 映射到 errno,C 库调用和系统调用设置的错误代码。)
  • 捕获异常只是将其重新抛出无用。您似乎想捕获异常以包装异常消息,但您并没有这样做。您还提到了数据库事务,所以我假设您想执行异常回滚。

关于perl eval block 抛出 execptions 没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41900629/

相关文章:

perl - 禁用 HTTP 请求中的 URL 编码

matlab - 在 MATLAB 中正确使用 eval 或避免使用它

perl - 催化剂 $c->req->params 为空?

perl - 为什么不建议使用create = dynamic?

linux - 在 apache 中运行 perl 脚本时出现 403 错误

perl - 未初始化的哈希键的默认值

linux - perl 脚本未在配置相同的三个虚拟主机中执行

javascript - 为什么事件处理程序能够劫持我对 eval 的直接调用?

javascript - nodejs 在测试用例中运行 eval

perl - 如何使用 fastcgi 和 perlbrew 为在 nginx 上运行的 Perl 催化剂应用程序创建初始化脚本