2011-01-27 10 views
8

Jaki jest najlepszy sposób przechwytywania błędów DBI w Perlu? Na przykład, jeśli wstawianie nie powiedzie się, ponieważ w wstawianych wartościach były niedozwolone znaki, w jaki sposób mogę nie dopuścić do niepowodzenia skryptu, ale przechwycić błąd i odpowiednio go obsłużyć.Perl DBI - przechwytywanie błędów

Nie chcę tego "umrzeć", ponieważ nie chcę przestać wykonywać skryptu.

Odpowiedz

12

Użyj konfiguracji RaiseError=>1 w DBI->connect i owinąć połączeń do $dbh i $sth w bloku try (TryCatch i Try::Tiny są dobre implementacje dla bloków try).

Więcej informacji na temat innych dostępnych zmiennych Connect można znaleźć pod numerem the docs.

na przykład:

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

Nie należy również wstawiać 'connect' w bloku' try'? – mscha

+0

@mscha: to nie jest konieczne - connect zwróci undef, jeśli się nie powiedzie. (Zobacz dokumentację - wystarczy sprawdzić, czy zwrócono $ dbh.) – Ether

+1

, ale ty * nie * sprawdzasz. – mscha

1

można również wykonać następujące czynności, która pozwoli Ci umrzeć, albo wdzięcznie obsłużyć błędy i kontynuować.

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