From: Arlen Cuss Date: 2008-04-01T15:51:37+09:00 Subject: Re: begin/rescue not behaving how I want ------=_Part_11491_9895103.1207032695293 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline 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/. > > ------=_Part_11491_9895103.1207032695293--