[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