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