Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

DBIx::Class die on warning

by bliako (Monsignor)
on Apr 04, 2020 at 13:29 UTC ( [id://11115042]=perlquestion: print w/replies, xml ) Need Help??

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

I am reading unclean data and inserting to DB. At this stage, I need DB insert() statements to die if something dodgy happens, even a warning, for example I get this Non-integer value supplied for column. I use db-connection parameters these: {RaiseError=>1,PrintError=>1} and wrap my insert() around an eval to catch any die(), like my $rc = eval { $obj->insert(); 1 }; if( $@ || ! $rc ){ die "error for this object: $obj" }

But it does not work. The warning stays a warning and does not elevate to a die as I had hoped.

This works but isn't it too heavy in a loop of thousands of inserts?

for my $obj (@objstoinsert){ local $SIG{__WARN__} = sub { die "died with $_[0], the object was $o +bj" } $obj->insert() }

Isn't there a simple flag to ask to elevate all warnings to errors and die?

p.s. I could localise __WARN__ to an outer scope but messes up other warn()'s.

Replies are listed 'Best First'.
Re: DBIx::Class die on warning
by Your Mother (Archbishop) on Apr 04, 2020 at 14:03 UTC

    From the DBI doc: “If you turn RaiseError on then you'd normally turn PrintError off. If PrintError is also on, then the PrintError is done first (naturally).” I don’t know but I am guessing that in whatever engine you are using the PrintError is turning off / superseding the RaiseError. DBIx::Class sets these properly by default. I wouldn’t tamper with the defaults.

Re: DBIx::Class die on warning
by hippo (Bishop) on Apr 04, 2020 at 13:58 UTC
    p.s. I could localise __WARN__ to an outer scope but messes up other warn()'s.

    So go for best of both worlds?

    { my $obj; local $SIG{__WARN__} = sub { die "died with $_[0], the object was $o +bj" } for $obj (@objstoinsert){ $obj->insert() } }

      thanks, i thought perhaps there was another way... that loop is a simplification, plus there are calls to other subs which also use warn(). So I will have to change using warn() for debug messages to something else which also provides automatic line numbers. Can be confess() perhaps.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (3)
As of 2024-04-25 22:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found