• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 539
  • Last Modified:

Exception Handling In perl

Is it possible to have exception handling in perl with try catch loop?  I  am using DBI and is inserting data from a csv into a database inisde a while loop. Can I use try catch loop instead of  eval {.........}; if($@){.....}   commands.  I want that if a insertion fails that the process should not stop and should continue after throwing an excpetion till the end of the CSV.  

I am trying to use the error module but it didn't work.......
use Error qw(:try);
try{
    $sql = qq{Insert into SHIMADZU_METADATA(User_id, Filename, Date_Time) values (?, ?, ?)};
    $sth = $dbh->prepare($sql) || die;
    $sth->execute($UserId, $datafile, $fileDate);
    $sth->commit();
}catch{

}
0
subirc
Asked:
subirc
  • 5
  • 2
  • 2
1 Solution
 
subircAuthor Commented:
Can eval statament do the same thing?

Thanks,
Subirc
0
 
jmcgOwnerCommented:
Yes, the eval statement can be used. The 'try' function from that module is mostly just syntactic sugar built around 'eval'.

You haven't explained "it didn't work" in enough detail for experts to be able to give you much of an answer. Please elaborate.
0
 
kanduraCommented:
jmcg is quite right. Eval will do just fine. In either way I'd recommend you turn on RaiseError on the database handle, at least for the duration of the try block:
That way it dies whenever there's an error, not just on the prepare (in fact, the execute statement is a lot more dangerous).

    eval {
        local $dbh->{RaiseError} = 1;

    };

   
FYI, the Error syntax is:

    try {
        ...
    } catch Error with {
        my $Err = shift;
        ...
    };

or

    try {
        ...
    } otherwise {
        ...
    };
0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
subircAuthor Commented:
jmcg,

"it didn't work" means that once a particular row failed and threw an error ....the script stopped running and nothing following got transmitted..................

Subirc
0
 
jmcgOwnerCommented:
Just off the top of my head, I think you'll need to arrange to insert one row at a time. This will allow you to handle and dismiss the exception when it occurs, then continue. I don't know of a way to both have the error reported and to continue processing after the error.
0
 
kanduraCommented:
Indeed.

You need to do the prepare beforehand, and wrap each execute in an eval. Optionally you could wrap the entire db business in another eval:

    use Error qw(:try);

    eval {
        $sql = qq{Insert into SHIMADZU_METADATA(User_id, Filename, Date_Time) values (?, ?, ?)};
        local $dbh->{RaiseError} = 1;
        my $sth = $dbh->prepare($sql);

        try{
            $sth->execute($UserId, $datafile, $fileDate);
            $sth->commit();
        } catch Error with {
            my $E = shift;
            $sth->rollback;
            warn "Error committing row: $E";
        };
    } or warn "Error with insert: $@";
0
 
subircAuthor Commented:
ya I am doing one row at a time

use strict;
use DBI qw(:sql_types);
eval{
      local $dbh->{RaiseError} = 1;      #added as per kandura's suggestion
      $sth->execute($UserId, $datafile, $fileDate);
      $sth->commit();
};
if ($@) {
    print $@
}

Here's the error.......
Can't locate object method "Commit" via package "DBI::st" (perhaps you forgot to load "DBI::st"?) ...never seen this error
0
 
subircAuthor Commented:
Think it's a diff error..... can't able to see commit........I tried  commit()....but still failed......
0
 
subircAuthor Commented:
got it;  it  shld be  $dbh->commit   not  $sth...................................!!!!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 5
  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now