2011-01-27 35 views
8

PerlでDBIエラーをキャプチャする最良の方法は何ですか?たとえば、挿入される値に不正な文字が含まれているために挿入が失敗した場合、スクリプトを失敗させることはできませんが、エラーをキャプチャして適切に処理できます。Perl DBI - エラーのキャプチャ

私はスクリプトの実行を止めたくないので、「やり」をしたくありません。

答えて

12

DBI->connectRaiseError=>1の構成を使用し、(TryCatchTry::Tinyがトライブロックのための優れた実装である)tryブロックで$dbh$sthにあなたの呼び出しをラップします。

利用可能な他の接続変数の詳細については、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:それは必要ではありません - 失敗した場合、connectは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"; 
} 
関連する問題