On 3/6/06, Tom Allison <[EMAIL PROTECTED]> wrote:
> Jay Savage wrote:
>
> >
> > die on errors and just keep passing them up the line:
> >
> > eval {
> > eval {
> > eval {
> > bad_system_call() or die "$!\n";
> > } or die $@;
> > } or die $@;
> > };
> >
> > print "eval says: [EMAIL PROTECTED]" if $@;
> >
> > As long as you keep propagating $@ in your die calls, the original
> > error message will get passed out.
> >
>
> I'm getting mixed messages between what you present and the following (I noted
> the 'or' being a huge difference):
>
> eval {
> eval { success() or die $! };
> if ($@ =~ /a peaceful death/) {
> euthenasia();
> return 0;
> } else {
> die; # no args! Will this propogate?
> }
> };
> if ( $@ =~ /something else/ ) {
> print "something happened that's not fatal\n";
> return 0;
> } else {
> die [EMAIL PROTECTED];
> }
> return 1;
>
> There's a distinct difference (in my own mind at least) between the different
> errors or responses that an applicatoin/method can have.
>
> There's a fatal error that needs to just kill the application.
> There's a really bad error that needs to be mentioned but at least I can
> respond
> to the client (net work connection) (return 0)
> There's a minor error to report to the client (return 0).
> There's a success process (return 1).
>
> So I guess the questions that I'm playing with are:
> Is my small code block about right?
> Will 'die' by itself propogate the contents of $@ ad infinitum?
>
> Is it as hard as I think it is to test exception handling?
> I can test some of them, but I can't test the FATAL stuff (unless I code
> munge).
>
die doesn't propigate the error, it returns a failure, along with
whatever you ask it to return. So if you say 'die $@', it passes along
the value of [EMAIL PROTECTED] Just as, when you use 'die $!' on a system call,
it
passes on the error generated by the system. If you just say die,
Since eval traps die, 'eval{ eval {} or die [EMAIL PROTECTED];};' is a
convenient
method for propagating $@ out of deeply nested evals. It's just a way
to save writing lots of if blocks that do nothing but pass $@ along.
The efect is the same as :
eval {
eval {} ;
if ($@) {
die $@;
}
};
The idea is to propagate $@ to some outer eval--or the main
routine--where you can deal with your error handling in a centralized
way, something like:
eval {
eval {
some;
snippet;
of;
code, perhaps with an;
eval {} or die $@;
} or die $@;
eval {
another;
block;
of;
code;
} or die $@ ;
};
if ($@) { # there was an error in the nested evals
log_error if $@ =~ /something/;
write_error_to_socket if $@ =~/something else/;
rollback_database if $@ =~ /something else again/;
die "You're dead: [EMAIL PROTECTED]" if $@ =~ /is fatal/;
}
HTH,
-- jay
--------------------------------------------------
This email and attachment(s): [ ] blogable; [ x ] ask first; [ ]
private and confidential
daggerquill [at] gmail [dot] com
http://www.tuaw.com http://www.dpguru.com http://www.engatiki.org
values of β will give rise to dom!