Я пытаюсь поместить некоторые транзакции DBIX под блоком eval
, чтобы сделать все транзакции или нет, если что-то пойдет не так в середине.perl eval block throwing execptions без ошибок
У меня есть несколько транзакций, которые выполняются так, и никто из них не дает мне проблем. Ни один, кроме одного:
Способ построения транзакций довольно сложный и, для чего он стоит, они действительно работают. Я могу опубликовать этот кусок кода, если вы хотите, но, возможно, блок 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' не будет действовать как транзакция базы данных, если это то, что вы надеетесь. Любые вызовы 'insert', которые не вызывали исключение, не будут откатываться, если последует ошибка. Кроме того, похоже, что '$ transaction {neuroexams}' должно быть ссылкой * array *, а не ссылкой на хеш. – Borodin
Проблема с 'eval {...} или do {...};' заключается в том, что она может перейти к 'do' из-за (возможно легитимного) ложного возврата из кода в' eval', что решает вопрос ikegami. Другой способ - явно проверить ошибку, 'eval {}; if ($ @) {...}; ', и в этом случае возврат не имеет значения (он не принимает решения об этом). – zdim
@borodin это очень интересно, потому что это означает, что я понял, что все это неправильно. Я фактически взял идею из уже работающего блока кода в другом приложении для каталогов на работе, и он был реализован, как указано выше, и в документации, касающейся этой реализации, явным образом сказал, что ожидаемое поведение состояло в том, чтобы создать «все или ничего». Было бы иначе, если бы я совершил транзакции в подпрограмме, а затем вычислил подпрограмму для изменения? –