Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic

Catching DBI (or other) errors

by nmerriweather (Friar)
on Mar 08, 2006 at 09:47 UTC ( [id://535129]=perlquestion: print w/replies, xml ) Need Help??

nmerriweather has asked for the wisdom of the Perl Monks concerning the following question:

I'm having an issue w/catching DBI errors

I do the following:
$query->execute() || { $SQL_FAIL = 1 };
which does exactly what i want - sets a var if the sql command fails, so I can handle the error with more granularity than handler error

The problem i've run into is this: the {} creates a hashref warning , which i'd like to get rid of . can anyone offer a suggestion?

Replies are listed 'Best First'.
Re: Catching DBI (or other) errors
by clinton (Priest) on Mar 08, 2006 at 11:17 UTC
    You could write it as

    $query->execute() or do { $SQL_FAIL = 1};
    But for a single line statement, you really don't need the braces, just :
    $query->execute() or $SQL_FAIL = 1;
    But why are you doing it this way?

    This means that you then have to check the value of SQL_FAIL every line before processing the next statement.

    Wrapping it all in an eval and using RaiseError really works a treat, looks clean makes your life simpler.

    If you are using the value of SQL_FAIL to figure out what statement failed, then you could go the other way and have $sql_stage (note, not all in capitals because this implies a constant, which it isn't) and you could just set $sql_stage to the current stage you're working on. As in
    my $sql_stage=1; eval { $query->execute(); $sql_stage = 2; $query2->execute(); $sql_stage = 3; $query3->execute(); }; if ($@) { if ($sql_stage < 3) { $fix1->execute(); } else { $fix2->execute(); } }
      If I were going to do something like this, I'd probably do something more like:
      $query->execute and $sql_stage++; $query2->execute and $sql_stage++;

        That would execute all queries even if one of them failed though. And if after your code finishes, $sql_stage is 1, you still don't know whether it was $query or $query2 that failed. Now add 3 or 4 more queries to that list and the $sql_stage variable becomes practically useless for anything except comparing to the total number of queries.

Re: Catching DBI (or other) errors
by virtualsue (Vicar) on Mar 08, 2006 at 11:24 UTC
    I suggest that you either replace the curly braces with parentheses, or use 'or' rather than '||':
    $query->execute() || ($SQL_FAIL =1); $query->execute() or $SQL_FAIL =1;
    'or' has a lower precedence than '=', but '||' has a higher precedence, which is what makes parentheses necessary in your original statement.
Re: Catching DBI (or other) errors
by nmerriweather (Friar) on Mar 08, 2006 at 21:51 UTC
    thanks to all.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://535129]
Approved by virtualsue
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (3)
As of 2024-04-16 23:35 GMT
Find Nodes?
    Voting Booth?

    No recent polls found