Begin/rescue not behaving how I want

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

Oh, and thanks of course!!

(Didn’t mean to be rude; got distracted pasting code)

Check out these two cases:

[email protected]:~$ 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:inirb_binding’
from /usr/lib/ruby/1.8/irb/workspace.rb:52

[email protected]:~$ 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.

Arlen C. wrote:

Check out these two cases:

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

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs