Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re: catching failures and retrying

by RazorbladeBidet (Friar)
on Mar 22, 2005 at 13:17 UTC ( [id://441438]=note: print w/replies, xml ) Need Help??


in reply to catching failures and retrying

I find the Error module to be a good OOP way of throwing/catching/retrying exceptions.

You can retry by calling a function from your catch block - there may be some redundant code, but there are workarounds for that.
--------------
It's sad that a family can be torn apart by such a such a simple thing as a pack of wild dogs

Replies are listed 'Best First'.
Re^2: catching failures and retrying
by mickey (Acolyte) on Mar 22, 2005 at 13:40 UTC

    Thanks very much. Error looks useful for error handling... I think that's a secondary concern for me, though.

    The big issue, I think (I'm still working on understanding what the crux of the problem is myself), is how to go back to a previous step.

    For instance, if my program proceeds like this:

    ## Step 1 go_to_web_page_A(); ## Step 2 look_for_stuff_on_web_page_A(); ## Step 3 submit_form_on_A_to_go_to_B();

    and it dies on step 2, that's almost always because step 1 failed. That is, it can't find the stuff it's looking for because the web page failed to load correctly.

    So what I want to do is catch the failure of look_for_stuff_on_web_page_A() and, in case of a failure, retry go_to_web_page_A(); and then look_for_stuff_on_web_page_A(); a couple times before finally giving up.

    Basically what it's doing is "Do A; Do B; If B fails, go back and do A again and then retry B;", and the part I'm having trouble with is the "If B fails, go back to A" part.

    Any thoughts?

      Error provides you a generic and extensible framework to handle errors, but it won't do exactly what you're looking for.

      You basically need a method of retrying, which can be handled as BrowserUk states, or, based upon your code - can be something like:
      # CODE NOT TESTED # for display purposes only # void in Utah my $rc = undef; my $i = 0; do { $rc = go_to_web_page(); } while ( !$rc && $i++ < 3 );
      or, perhaps, using Error
      # CODE NOT TESTED # for display purposes only # void in Utah my $i = 0; GET_PAGE: while ( $i < 3 ) { try { go_to_web_page(); # the above has to throw some kind of error # for this to work last GET_PAGE; } catch Error with { $i++; }; }
      I'm sure there's a cleaner way to do that, but it's just an example off the top of my head (proof of concept).
      --------------
      It's sad that a family can be torn apart by such a such a simple thing as a pack of wild dogs

        Thanks very much. I like your examples -- I think my problem is that I haven't actually encapsulated each step of the program in a neat way. The necessary values for each step and the side effects each step produces are all entwined with each other.

        So I guess I need to do some work on the general structure of the program.

        Thanks for your help!

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others musing on the Monastery: (7)
As of 2024-04-23 11:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found