[Wellington-pm] Rethrowing exceptions

Dan Horne dan.horne at redbone.co.nz
Mon Nov 6 12:39:37 PST 2006


Increasingly, I've been using Exception::Class in my apps because it allows
me to declare and throw named exceptions. I'm not typically interested in
the stack trace, but it does have a class method called Trace which may be
useful.

Dan

> -----Original Message-----
> From: wellington-pm-bounces+dan.horne=redbone.co.nz at pm.org 
> [mailto:wellington-pm-bounces+dan.horne=redbone.co.nz at pm.org] 
> On Behalf Of Srdjan
> Sent: Tuesday, 7 November 2006 9:31 a.m.
> To: Wellington Perl Mongers (Perl user group)
> Subject: Re: [Wellington-pm] Rethrowing exceptions
> 
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> I will only second this by a more elaborate example:
> 
> eval {
>     # some stuff
>     die 
> MyExceptionObjectThatCapturesStackAndGodKnowsWhatElse->new("It
>  broke"); };
> 
> if ($@) {
>     my $reason = ref($@) ? $@->message() : $@;
>     print "Oh dear, it didn't work, because: $reason\n";
>     die $@;
> }
> 
> This way original stack trace is preserved. I don't know of 
> any more elegant way.
> 
> Srdjan
> 
> Grant McLean wrote:
> > On Mon, 2006-11-06 at 17:04 +1300, Ewen McNeill wrote:
> >> Hi,
> >>
> >> In perl you can (sort of) do exception handling by doing:
> >>
> >> eval { 
> >>    # some stuff
> >>    die "It broke";
> >> };
> >>
> >> if ($@) {
> >>   print "Oh dear, it didn't work, because: $@\n"; }
> >>
> >> However I can't find any obvious way of rethrowing an exception
> > 
> > As Michael said, you re-throw an exception by saying:
> > 
> >   die $@;
> > 
> > 
> > If you initially throw the exception by calling die like this ...
> > 
> >   die "too many squingles";
> > 
> > ... then if your string doesn't end with a newline, perl 
> will append " 
> > at <filename> line <number>.\n" to the string before 
> storing it in $@.
> > Consequently, if you re-throw the exception it will retain the 
> > filename and line number of where the exception originally occurred.
> > 
> > If you want a stack trace rather than just a line number 
> then Carp.pm 
> > (a core module) is the standard tool.  You can either use 'confess' 
> > instead of die whenever you want a stack trace or you can enable 
> > 'verbose' mode and always use croak:
> > 
> >   use Carp qw(verbose croak);
> > 
> > 
> > If you're testing whether an exception was something you 
> can handle, 
> > then you probably want to use exception objects rather than 
> passing a 
> > string to die and then later testing it with a regex.  I can't say 
> > I've done that much myself, but Exception::Class seems to be an 
> > effective tool.
> > 
> > The Error.pm module is an alternative tool for exception 
> objects which 
> > offers some syntactic sugar in the form of try/catch blocks.
> > Unfortunately, nesting them leads to memory leaks which 
> kind of limits 
> > their usefulness.
> > 
> > Cheers
> > Grant
> > 
> > _______________________________________________
> > Wellington-pm mailing list
> > Wellington-pm at pm.org
> > http://mail.pm.org/mailman/listinfo/wellington-pm
> > 
> > 
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.5 (GNU/Linux)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
> 
> iD8DBQFFT5ucZtcHxCitRpgRAqEcAKCPK2NkoqHX4ZCnqrlLaVZRx3DqGgCggOCD
> K4f81xvEHYsS9/bmhlOnUbs=
> =itC+
> -----END PGP SIGNATURE-----
> _______________________________________________
> Wellington-pm mailing list
> Wellington-pm at pm.org
> http://mail.pm.org/mailman/listinfo/wellington-pm
> 



More information about the Wellington-pm mailing list