2011-01-27 6 views
8

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

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

ответ

12

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

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

, например:

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: $_"; 
}; 
+1

Разве вы не должны помещать 'connect' в блок' try'? – mscha

+0

@mscha: это не обязательно - соединение вернет undef, если оно не сработает. (См. Документы - вам просто нужно проверить, был ли возвращен $ dbh.) – Ether

+1

, но вы * не проверяете. – mscha

1

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

$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"; 
}