NAME
Error::Unhandled - a Module for letting Errors do their own
handling
SYNOPSIS
use Error qw(:try);
use Error::Unhandled;
try {
&foo;
} otherwise {
my $E = shift;
print "I caught:\n".$E->stringify."\n\n";
};
&foo;
sub foo {
throw Error::Unhandled(unhandled => sub {print "No one handled this.\n"; exit});
}
DESCRIPTION
While doing ASP programming, I wanted to use an object oriented
exception handling system. Graham Barr pointed me at `Error.pm',
which handled almost everything I needed. It was missing,
however, a way for exceptions to define their own default error
handling behavior. This can be very useful when ASP programming
- someone using your object can decide to implement their own
error handling routines, but if they don't the user will at
least get a semi-informative message in their browser. After
trying several different approaches, I ended up with a subclass
of `Error' titled `Error::Unhandled'.
The only difference in behavior between `Error::Unhandled' and
`Error' is what happens when `throw' is called. The
implementation of `throw' in `Error::Unhandled' uses `caller' to
search the call stack, looking for `Error::subs::try'. If it
finds one, it throws the exception as per normal behavior. If it
doesn't find one, it calls `$self->unhandled'. Before doing
that, however, it checks to see if the element `unhandled' is
defined in its hash. If it is and it is a reference to a
subroutine, it calls that instead. Note that if the element
`unhandled' is present and is not a reference to a subroutine,
`throw' will not call `$self->unhandled'. Finally, after all of
that returns, `throw' will throw the exception as per normal
behavior. If you don't want it to throw the exception, call
`exit' or `die' within your `unhandled' subroutine.
It is, of course, also possible (and recommended in many
situations) to sub class `Error::Unhandled' and provide a class-
defined implementation of `unhandled'. Also note that both the
instance-defined and class-defined `unhandled' methods receive
`$self' as their first parameter.
Installation instructions
This module requires `Error', available from CPAN.
AUTHOR
Toby Everett,
[email protected]