23 March 2011

(Perl) DBIでのエラー処理

DBIでのエラー発生でスクリプトを終了させずに処理を行う方法のメモ

次の例では、エラー発生でスクリプトが中断(終了)する。

#!/isr/bin/perl use warnings; use strict; use utf8; use DBI; my $str_dsn = 'DBI:SQLite:dbname=/var/www/perl-dbi-test/data/test.db'; my $dbh = DBI->connect($str_dsn, '', '', {PrintError => 0, AutoCommit => 1}) or die("connect error (".DBI::errstr.")\n"); my $str_query = "insert into test_tbl values(null,?,?)"; $sth = $dbh->prepare($str_query) or die("prepare error (".DBI::errstr.")\n"); $sth->execute($str_data1, $str_data2) or die("execute error (".DBI::errstr.")\n"); $dbh->disconnect();

次のようにすれば、エラー発生時のdieをキャッチして、スクリプトを終了させない

#!/isr/bin/perl use warnings; use strict; use utf8; use DBI; my $str_dsn = 'DBI:SQLite:dbname=/var/www/perl-dbi-test/data/test.db'; my $dbh = undef; eval{ $dbh = DBI->connect($str_dsn, '', '', {PrintError => 0, AutoCommit => 1}) or die(DBI::errstr); my $str_query = "insert into test_tbl values(null,?,?)"; $sth = $dbh->prepare($str_query) or die(DBI::errstr); $sth->execute($str_data1, $str_data2) or die(DBI::errstr); $dbh->disconnect(); } if($@){ if(defined($dbh)){ $dbh->disconnect(); } print "error(".$@.")\n"; }

DBIモジュールでのエラーはDBI::errstrに返されているので、これをdieの引数として渡す(if文の$@に渡される)か、もしくはif文内でDBI::errstrを呼び出すか、どちらでも良いと思う。

■ 参考リンク
[Perl]evalの中で起こったエラーを検出する