Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re^6: Learning how to use the Error module by example

by adrianh (Chancellor)
on Jul 29, 2003 at 20:40 UTC ( [id://278982]=note: print w/replies, xml ) Need Help??


in reply to Re4: Learning how to use the Error module by example
in thread Learning how to use the Error module by example

The first example, to me, is an example of how not to use try-catch. To me, you shouldn't be doing a return 0 within a catch. You should be rethrowing some error after doing what you needed to do. The only return statement should be as a result of success. Regardless of memory leaks, that's just poor practice.

I think that's a rather broad statement. Many people (myself included) think that multiple-returns can make code a lot clearer in some circumstances. For example, while you could rewrite this with a single return

sub find { my ($self, $search_item) = @_; eval { # skip expensive search if item not stored anywhere return unless $search_item->stored; # otherwise do expensive search $self->first; while (my $item = $self->next) { return 1 if $item == $search_item; }; return; }; if ($@) { ... handle exceptions here ... }; };

I would argue that it would be harder to grok than the version above.

For me the main problem with Error is the fact that wrapping a bit of code in a catch block shouldn't change its semantics. This can lead to really odd behaviour when fiddling with exception based code.

Replies are listed 'Best First'.
Re7: Learning how to use the Error module by example
by dragonchild (Archbishop) on Jul 30, 2003 at 13:30 UTC
    My point is that if you're wrapping in a try-block, you should be throwing exceptions, even something like Error::OK or the like. In fact, I wouldn't even call them exceptions, really. They're more like signals within the same process. Just because we use them 99.999% of the time to indicate an abnormal situation doesn't mean that this is what they should be limited to ...

    ------
    We are the carpenters and bricklayers of the Information Age.

    Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement.

    Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified.

      In the find() example, assuming that stored(), next() and first() can throw error exceptions, show me some simpler code using exceptions rather than multiple returns.

      I've no objection to using exceptions for non-error conditions. I do it all the time :-)

      However, I do have an objection to making my code more complex because of an arbitrary rule. Why should I not use return within a try block when it makes my code far easier to understand and maintain than the alternative? What is the downside?

        sub find { my ($self, $search_item) = @_; eval { # skip expensive search if item not stored anywhere throw Signal::Search::Not_Stored unless $search_item->stored; # otherwise do expensive search $self->first; while (my $item = $self->next) { throw Signal::Search::Found if $item == $search_item; }; throw Signal::Search::Not_Found; }; if ($@) { my $e = $@; # Do NOT handle Signals here. Those propagate back # up to the caller who will handle them appropriately. throw $e if $e->isa('Signal::Search'); ... handle exceptions here ... }; };
        I would argue that you have three possible return codes - NOT_STORED, FOUND, NOT_FOUND, plus all the possible exceptions that can occur. Instead of trying to shoehorn your return codes into a C-like morass of constants and bit-vectors, use signalling exceptions! Heck, you can even include a reference to the found item in your Signal::Search::Found object, if you were so inclined. And, your code is self-commenting because you make a distinction between NOT_STORED and NOT_FOUND, in case the caller or reader cares. If they don't, they can explicitly treat the two cases the same, increasing the commenting.

        ------
        We are the carpenters and bricklayers of the Information Age.

        Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement.

        Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://278982]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (3)
As of 2024-03-29 01:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found