On Wed, 16 Jul 2003, John Siracusa wrote:
> Here's my take on handling parse errors, and error handling in general.
>
> 1. I don't like to (unconditionally) die from within libraries except for
> conditions that are totally avoidable. For example, I die if you forget to
> send a required argument. But I would not die in a parse() function that is
> expected to handle user-created input! That would force everyone to use an
> exception-handling style of error checking just to use your modules, which
> is not nice.
Yeah, I can buy this, since parsing is inherently something that can fail,
and it often need not be fatal, because it doesn't indicate a usage error,
as opposed to bad parameters.
> 2. I use plain old undef as my error return value, but I sometimes document
> the methods saying that any false value is an indication that there was an
> error. This works in all methods that return objects (which is most of the
> ones I write, and any parsing method in DT).
This also makes sense.
> 3. I make sure I store some sort of sensible error message or code somewhere
> convenient, letting the user of the library know why something failed. Even
> if it's only "Invalid date: 'foobar'", it goes a long way towards making
> debugging easier.
>
> I think this system gives the most flexibility to the user of a library.
> Examples:
>
> # Use fatal errors
> $dt = DateTime->parse(...) or die DateTime->error;
> $dt->parse(...) or die $dt->error;
>
> # Use non-fatal errors
> if($dt = DateTime->parse(...)) { ... }
> else { warn DateTime->error }
>
> if($dt->parse(...)) { ... }
> else { warn $dt->error }
>
> # Use exception handling
> eval
> {
> $dt = DateTime->parse(...) or die DateTime->error;
> $dt->parse(...) or die $dt->error;
> ...
> };
>
> if(@$) { ... }
>
> Finally, I want to immediately help anyone who does this:
>
> $dt = DateTime->parse(...);
> $dt->set(...);
>
> By puking all over them right then and there. While a "DT::Undef" object
> might be useful for some, it should not be used as a return value in the
> case of an error. People who want to use it can just do this:
>
> $dt = DateTime->parse(...) || DateTime::Undef->new;
I agree.
-dave
/*=======================
House Absolute Consulting
www.houseabsolute.com
=======================*/