Re: Documentation / Error checking
- From: Tim.Bunce@xxxxxxxxx (Tim Bunce)
- Date: Fri, 18 Nov 2005 13:42:42 +0000
On Fri, Nov 18, 2005 at 02:15:50PM +0200, Nitzan Shaked wrote:
> (A bit long)
> (Bottom line: is it, or is it not, enough to always check DBI::err)
>
> Hello
>
> The documentation for how to check the success of various DBI calls, and in
> particular do(), selectrow_foo() and selectall_foo() is unclear and not
> precise, at least for me. Actually I am not sure, after scrutinizing, how
> exactly to check for errors.
>
> Specific problems:
>
> Looking at the doc for "err", we see: "The DBI resets $h->err to undef
> before most DBI method calls", note the "most". Since the documentation for
> specific methods does not say which do *not* reset err, I have no way of
> knowing which do and which don't.
I'll clarify the docs. Basically all methods calls reset err except for
just a few special cases such as err and errstr, obviously, and FETCH
(eg $foo = $h->{SomeAttribute}).
For the record, here's the current list of methods that don't reset err:
DBI::common::CLEAR
DBI::common::DESTROY
DBI::common::EXISTS
DBI::common::FETCH
DBI::common::FIRSTKEY
DBI::common::NEXTKEY
DBI::common::STORE
DBI::common::debug
DBI::common::dump_handle
DBI::common::err
DBI::common::errstr
DBI::common::func
DBI::common::parse_trace_flag
DBI::common::parse_trace_flags
DBI::common::private_data
DBI::common::state
DBI::common::trace
DBI::common::trace_msg
DBI::db::ping
DBI::db::rows
DBI::st::rows
This is a fuzzy area of the DBI and I'm not guaranteeing that this list
won't change over time.
> Also: looking at (for example) the doc for selectall_hashref(), we can find:
> "If any method except fetchrow_hashref fails, and "RaiseError" is not set,
> selectall_hashref will return undef. If fetchrow_hashref fails and
> "RaiseError" is not set, then it will return with whatever data it has
> fetched thus far. $DBI::err should be checked to catch that".
> selectall_arrayref() and selectcol_arrayref() have similar documentation.
>
> To me this looks like the correct way to check selectall_hashref() is then:
> my $hr = $dbh->selectall_hashref( ... ); (!defined $hr || defined $DBI::err)
> && die( ... );
Well, if you're going to die() I'd just set RaiseError and forget about it.
If there's some good reason you don't want to use RaiseError then this
would do:
my $hr = $dbh->selectall_hashref( ... );
die(...) if $DBI::err;
> Looking at selectrow_hashref() says that error is indicated by undef. It
> does *not* say err will be set. So I can only assume I need to:
>
> my $hr = $dbh->selectrow_hashref( ... ); !defined $hr && die( "..." );
my $hr = $dbh->selectrow_hashref( ... ) or die(...);
Tim.
.
- Follow-Ups:
- RE: Documentation / Error checking
- From: Nitzan Shaked
- RE: Documentation / Error checking
- References:
- Documentation / Error checking
- From: Nitzan Shaked
- Documentation / Error checking
- Prev by Date: DBD::Oracle on HPUX (was: help me ,please!)
- Next by Date: RE: Documentation / Error checking
- Previous by thread: Documentation / Error checking
- Next by thread: RE: Documentation / Error checking
- Index(es):