--- On Wed, 7/4/10, Lutz Gehlen <lrg...@gmx.net> wrote:

> From: Lutz Gehlen <lrg...@gmx.net>

> I understand that I can build a hierarchy of exception
> classes using 
> Exception::Class. But when I throw an exception I still
> have to 
> assemble the error message there, e.g.:
> 
> if(!defined($foo)) {
>     My::Exception::Class->throw
>         ('Variable foo is undefined. We are doomed.');
> }

You mentioned aliasing, but I want to give an explicit example so people can 
see what's going on. I'll also assert that we're using the new // operator 
because this can make a lot of the boilerplate go away:

  $foo // throw_undef 'Variable foo is undefined. We are doomed';

That's much nicer (which is important. It's not just sugar!)

> What I need a central place for is the definition of the
> actual 
> error messages. With my module Exception::EasyThrow, I can
> write at 
> the beginning of my module:
> 
> use Exception::EasyThrow
>     (var_ud => 'Variable %s is undefined. We
> are doomed.',
>      ... => ...);
> 
> and then later
> 
> var_ud('foo') if(!defined($foo));

Then why not supply a patch for Exception::Class to allow it handle formats?

Note, in your code above, you can still have different error messages in 
different packages.  You've made things a touch easier, but not really solved 
the underlying problem.  What about this proposal for Exception::Class?

  package My::Exceptions;

  use Exception::Class (
      'MyException',
      'IORead' => {
          isa    => 'MyException',
          alias  => 'throw_io_read',
          format => [ 'Cannot open %s for reading: %s' ],
      },
  );

And then:

  use My::Exceptions 'throw_io_read';

  open my $fh, '<', $filename or throw_io_read $filename, $!;

Presumably the format should try to determine the number of conversions in the 
format and perhaps the alias could generate a sub with a corresponding 
prototype like 'sub throw_io_read($$)'.  That might give you a touch of 
compile-time safety. Haven't really thought too carefully about this, though.

With this strategy, you really *do* get to avoid both varying messages and 
verbosity.

Cheers,
Ovid
--
Buy the book         - http://www.oreilly.com/catalog/perlhks/
Tech blog            - http://blogs.perl.org/users/ovid/
Twitter              - http://twitter.com/OvidPerl
Official Perl 6 Wiki - http://www.perlfoundation.org/perl6


Reply via email to