If I understand you right, you want the possibility to define exception 
hierarchies _and_ the possibility to have a constant way of throwing exception 
that is shorter to write.

you can declare classes and derivatives very easily without using 
Exception::Class simply with the 'package' keyword and 'use parent'.

Since the exception classes are just normal perl classes, they can also have 
member functions.


package my_exception_base ;

...

package undefined_variable_exception ;
use parent my_exception_base ;

sub throw_undef
{
my ($exception_message) = @_ ;

...
}

if the sub calls are not too expensive in you code you could even have

package undefined_variable_exception ;
use parent my_exception_base ;
use Carp ;

sub undefined_exception
{
my ($is_undefined, $name, $message) = @_ ;

unless(defined $is_defined)
        {
        croak "$name is not defined. We are $message!\n" ;
        }
}

in your code

undefined_exception($foo, 'foo', 'doomed') ;


But don't throw Exception::Class just yet as it gives you a lot of sugar you 
may not want to re-implement. Although I haven't looked at its implementation, 
my guess is that it does create the classes in some way; just pepper those 
classes with your own subs and you'll be done.

my guess is that something like the code below will work.

 use Exception::Class (
      'MyException',
      'AnotherException' => { isa => 'MyException' },
        ) ;

  package AnotherException ;
  sub throw_another {} ;
  
  package wherever_you_want_to_be ;


last but not least, a patch to E::C may be accepted by its author.  

Cheers, Nadim.



> This might be one point where I don't understand how people use 
> Exception::Class or how they throw exceptions at all. As I wrote in 
> the original mail I might miss something here.
> 
> 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.');
> }
> 
> As already shown by this simple example this is likely to span 
> several lines thereby drawing unnecessary attention of the reader.
> This is mitigated a little bit by the alias parameter of 
> Exception::Class. However, if I don't pay close attention I might 
> write somewhere else:
> 
> if(!defined($bar)) {
>     My::Exception::Class->throw
>         ('We are doomed because variable bar is undefined.');
> }
> 
> which is not how it should be. The same kind of error should produce 
> the same message.
>  
> 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));
> 
> which is often possible in one line.
> By default, it just croaks the message, but it can be set up to 
> throw an Exception::Class object or do something else.
> 
> Do you see what I mean? Is this possible with Exception::Class 
> alone? Or is it stupid for some reason to want this?
> 
> Thanks to everybody for advice
> Lutz

Reply via email to