On Thu, Jan 15, 2004 at 12:04:47PM -0000, Avis, Ed wrote:
> Tim Bunce wrote:
>
> >>>A statement handle should always have NAME, TYPE, NULLABLE etc
> >>>attributes. It should never be an error to ask for them. But the
> >>>value returned may be undef, for example, if the statement
> >>>has not been executed, the execute failed, or it's not a select
> >>>statement.
> >>
> >>If RaiseError is set, then shouldn't accessing one of these
> >>when it is not available throw an exception rather than giving undef?
> >
> >I don't think so. It's not an error, it's just unavailable
> >(although you could argue it either way).
>
> You give a long list of possible reasons why the data could be
> unavailable, quoted above. Undef could mean any of those and it's not
> possible to find out which. An exception can say what the problem is.
>
> You'd get questions from beginners saying 'I get $sth->{NAME} but it is
> always undef, what am I doing wrong?'. The answer is probably that you
> need to execute() first. An error message would make this obvious.
>
> Or consider porting a program from one DBD driver to another. The
> original driver made {NAME} available before executing, but the new one
> does not. It would be better to see an obvious failure rather than have
> the program get undef and go wrong later.
>
> You can of course write your code to always check that an attribute is
> defined after fetching it. But the point of RaiseError is that you
> don't have to type these explicit checks after every DBI operation.
I've remembered the deeper issue here...
FETCH is marked as a 'keep_error' method. That means that err & errstr
are not cleared before the call and not checked (for RaiseError etc)
after it.
I'm reluctant to change that as any code that fetches an attribute
after a method call but before checking $h->err (or $DBI::err) will
now not see the error.
For DBI v2 I'll look into adding a mechanism to let some methods
only check for 'new' errors.
Then, for the example above, the old err will only be 'lost' if it's
replaced by a new one. (And DBI 1.41 will ensure the old errstr text is
appended to rather than overwritten.)
Tim.