begin/rescue not behaving how I want

Discussion in 'Ruby' started by J. Cooper, Apr 1, 2008.

  1. J. Cooper

    J. Cooper Guest

    So I have some code that routinely checks for email in a cron job. Most
    of the time it works great. However, sometimes it gets a timeout error,
    which is fine; it happens. The thing is, I don't want it to clog up my
    logs when it does, because it's not an exception I'm worried about. So I
    tried wrapping the code in question in a begin/rescue block that just
    exits on exception, thinking that then it the error would be "caught"
    and it wouldn't have to bug me about it... but it continues to do so.
    How do I get what I want to achieve here?

    (The relevant code, if needed):
    begin
    Net::pOP3.start('foo', 110, 'bar', 'foobar') do |pop|
    if pop.mails.empty?
    exit
    else
    # blah blah etc.
    end
    end
    rescue
    exit
    end
    --
    Posted via http://www.ruby-forum.com/.
     
    J. Cooper, Apr 1, 2008
    #1
    1. Advertising

  2. J. Cooper

    J. Cooper Guest

    J. Cooper, Apr 1, 2008
    #2
    1. Advertising

  3. J. Cooper

    Arlen Cuss Guest

    [Note: parts of this message were removed to make it a legal post.]

    Check out these two cases:

    celtic@sohma:~$ irb
    >> begin

    ?> raise TimeoutError, "data"
    >> rescue
    >> puts "Test?"
    >> end

    (irb):2:in `irb_binding': data (Timeout::Error)
    from /usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
    from /usr/lib/ruby/1.8/irb/workspace.rb:52

    celtic@sohma:~$ irb
    >> begin

    ?> raise TimeoutError, "data"
    >> rescue TimeoutError => t
    >> puts "Error with #{t}."
    >> end

    Error with data.
    => nil
    >>


    In the first one, the exception is raised (and irb doesn't catch it and
    dies). In the second one, we explicitly catch TimeoutError, and it's fine.
    Why so?

    TimeoutError isn't a "StandardError", which is the default thing that
    `rescue' tries to rescue when you leave it blank!

    >> TimeoutError.superclass

    => Interrupt
    >> Interrupt.superclass

    => SignalException
    >> SignalException.superclass

    => Exception
    >>


    Notice that it goes TimeoutError < Interrupt < SignalException < Exception.
    Whereas, for example...

    >> ZeroDivisionError.superclass

    => StandardError
    >> StandardError.superclass

    => Exception
    >>


    A ZeroDivisionError is of superclass StandardError (which is then an
    Exception). So it would get caught.

    To catch all cases, try rescue Exception -- or REALLY all cases with rescue
    Object. (if you're crazy.) But of course, try not to catch anything you're
    not expecting - that's how unexpected errors turn up. Instead, perhaps just
    rescue Timeout (if it's the only error you expect). That way other errors
    you don't expect aren't silently thrown away [leading to frustration for you
    when you try to debug!]

    Cheers,
    Arlen.
    On Tue, Apr 1, 2008 at 3:49 PM, J. Cooper <> wrote:

    > So I have some code that routinely checks for email in a cron job. Most
    > of the time it works great. However, sometimes it gets a timeout error,
    > which is fine; it happens. The thing is, I don't want it to clog up my
    > logs when it does, because it's not an exception I'm worried about. So I
    > tried wrapping the code in question in a begin/rescue block that just
    > exits on exception, thinking that then it the error would be "caught"
    > and it wouldn't have to bug me about it... but it continues to do so.
    > How do I get what I want to achieve here?
    >
    > (The relevant code, if needed):
    > begin
    > Net::pOP3.start('foo', 110, 'bar', 'foobar') do |pop|
    > if pop.mails.empty?
    > exit
    > else
    > # blah blah etc.
    > end
    > end
    > rescue
    > exit
    > end
    > --
    > Posted via http://www.ruby-forum.com/.
    >
    >
     
    Arlen Cuss, Apr 1, 2008
    #3
  4. J. Cooper

    J. Cooper Guest

    Arlen Cuss wrote:
    > Check out these two cases:



    You are a gentleman and a scholar! Thank you!!

    --
    Posted via http://www.ruby-forum.com/.
     
    J. Cooper, Apr 1, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Richard Lionheart
    Replies:
    15
    Views:
    201
    Richard Lionheart
    Jul 18, 2004
  2. Harold Hausman

    Question about begin, rescue, end.

    Harold Hausman, Nov 18, 2005, in forum: Ruby
    Replies:
    9
    Views:
    184
    Stefan Kaes
    Nov 18, 2005
  3. Joe Ruby

    begin...rescue...retry next?

    Joe Ruby, Aug 16, 2006, in forum: Ruby
    Replies:
    8
    Views:
    218
    Joe Ruby
    Aug 16, 2006
  4. S Kanakakorn

    Help begin/rescue/ensure

    S Kanakakorn, Feb 9, 2007, in forum: Ruby
    Replies:
    4
    Views:
    133
    Brian Candler
    Feb 9, 2007
  5. RichardOnRails
    Replies:
    4
    Views:
    186
    RichardOnRails
    Sep 27, 2010
Loading...

Share This Page