Perl DBI - ошибки захвата - PullRequest
       3

Perl DBI - ошибки захвата

9 голосов
/ 28 января 2011

Как лучше всего регистрировать ошибки DBI в Perl? Например, если вставка завершилась неудачно из-за того, что во вставляемых значениях были недопустимые символы, как можно избежать сбоя сценария, но зафиксировать ошибку и обработать ее соответствующим образом.

Я не хочу делать «или умру», потому что я не хочу останавливать выполнение сценария.

Ответы [ 2 ]

12 голосов
/ 28 января 2011

Используйте конфигурацию RaiseError=>1 в DBI->connect и оберните ваши вызовы в $dbh и $sth в блоке try ( TryCatch и Try :: Tiny являются хорошими реализациями для блоков try).

См. документы для получения дополнительной информации о других доступных переменных подключения.

например:

use strict;
use warnings;

use DBI;
use Try::Tiny;

my $dbh = DBI->connect(
    $your_dsn_here,
    $user,
    $password,
    {
        PrintError => 0,
        PrintWarn  => 1,
        RaiseError => 1,
        AutoCommit => 1,
    }
);
try
{
    # deliberate typo in query here
    my $data = $dbh->selectall_arrayref('SOHW TABLES', {});
}
catch
{
    warn "got dbi error: $_";
};
3 голосов
/ 14 октября 2014

вы также можете сделать следующее, что позволит вам умереть или изящно обработать ошибки и продолжить.

$dbh = DBI->connect($data_src, $user, $pwd) or die $DBI::errstr;

my $sth = $dbh->prepare("DELETE FROM table WHERE foo = '?'");
$sth->execute('bar');
if ( $sth->err )
{
  die "DBI ERROR! : $sth->err : $sth->errstr \n";
}
...