[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

begin/rescue not behaving how I want

J. Cooper

4/1/2008 4:49:00 AM

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-....

3 Answers

J. Cooper

4/1/2008 4:52:00 AM

0

Oh, and thanks of course!!

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

--
Posted via http://www.ruby-....

Arlen Cuss

4/1/2008 6:52:00 AM

0

[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 <nefigah@gmail.com> 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-....
>
>

J. Cooper

4/1/2008 7:23:00 AM

0

Arlen Cuss wrote:
> Check out these two cases:


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

--
Posted via http://www.ruby-....