From: Mark Hubbart Date: 2004-08-09T17:06:48+09:00 Subject: Re: Problem with exception not beeing caught On Aug 9, 2004, at 12:16 AM, Michael Mueller wrote: > Dear rubyists! > > I have a problem with a small programm, that's fetching emails from my > account and then goes to sleep for X seconds. > The code looks somehow like this: > > loop do > begin > load FILTERFILE > BOXES.each{|box| check_mailbox(box)} > $log.debug("Gehe f�r #{SLEEPTIME} Sekunden schlafen!") > sleep(SLEEPTIME) > rescue > $log.warn("Fehler aufgetreten:#{$!}\n#{$!.backtrace}") > end > end > > From time to time I get an exception in check_mailbox because the > mailserver > doesn't respond so I'm gettin: > mi@ceres:~$ mail-forward.rb -n > /usr/local/lib/ruby/1.8/timeout.rb:42:in `new': execution expired > (Timeout::Error) > from /usr/local/lib/ruby/1.8/net/protocol.rb:83:in `connect' > from /usr/local/lib/ruby/1.8/net/protocol.rb:82:in `timeout' > from /usr/local/lib/ruby/1.8/timeout.rb:55:in `timeout' > from /usr/local/lib/ruby/1.8/net/protocol.rb:82:in `connect' > from /usr/local/lib/ruby/1.8/net/protocol.rb:64:in `initialize' > from /usr/local/lib/ruby/1.8/net/pop.rb:427:in `open' > from /usr/local/lib/ruby/1.8/net/pop.rb:427:in `do_start' > from /usr/local/lib/ruby/1.8/net/pop.rb:415:in `start' > from /home/mi/bin/mail-forward.rb:45:in `check_mailbox' > from /home/mi/bin/mail-forward.rb:89 > from /home/mi/bin/mail-forward.rb:89:in `each' > from /home/mi/bin/mail-forward.rb:89 > from /home/mi/bin/mail-forward.rb:86:in `loop' > from /home/mi/bin/mail-forward.rb:86 > > I guess that's kinda normal, but: Why isn't this exception caught???? I > expected the exception in my logfile and the program to continue, but > obviously the program exits before getting into the rescue block?? > > Any ideas what i'm doing wrong? When you don't specify an exception class to rescue from, it defaults to StandardError. Timeout::Error doesn't inherit from StandardError, so it goes uncaught: # show the ancestors: no StandardError! Timeout::Error.ancestors ==>[Timeout::Error, Interrupt, SignalException, Exception, Object, Kernel] # test rescuing the lowest exception class possible: Exception. begin raise Timeout::Error rescue Exception p 'rescued!' end "rescued!" ==>nil # test an unspecified exception class: begin raise Timeout::Error rescue p 'rescued!' end (irb):9:in `irb_binding': Timeout::Error (Timeout::Error) from /usr/local/lib/ruby/1.9/irb/workspace.rb:52:in `irb_binding' from /usr/local/lib/ruby/1.9/irb/workspace.rb:52 In fact, this made IRB die off on me; IRB didn't catch the error either. HTH, Mark