Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Perl DBI - Capturing errors

What's the best way of capturing any DBI errors in Perl? For example if an insert fails because there were illegal characters in the values being inserted, how can I not have the script fail, but capture the error and handle it appropriately.

I don't want to do the "or die" because I don't want to stop execution of the script.

like image 528
Chris Avatar asked Jan 27 '11 23:01

Chris


2 Answers

Use the RaiseError=>1 configuration in DBI->connect, and wrap your calls to the $dbh and $sth in a try block (TryCatch and Try::Tiny are good implementations for try blocks).

See the docs for more information on other connect variables available.

for example:

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: $_";
};
like image 149
Ether Avatar answered Sep 21 '22 07:09

Ether


you can also do the following, which will allow you to die, or gracefully handle the errors and continue.

$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";
}
like image 38
tquiring Avatar answered Sep 23 '22 07:09

tquiring