Hi,
I have a program that I am using to do password auditing on various
IMAP servers. It defines this method:
def tryIMAP (host, usessl, user, pass)
proto = usessl ? "IMAPS" : "IMAP"
begin
imap = Net::IMAP.new(host, usessl ? 993 : 143, usessl)
rescue => e
imap.disconnect if imap
STDERR.print "#{host} #{proto} #{e.to_s}\n";
raise RuntimeError, "#{proto} failed"
end
begin
imap.login( user, pass)
imap.logout
imap.disconnect
'success'
rescue Net::IMAP::NoResponseError
'failure'
end
end
But the rescue clause does not catch all errors:
(Net::IMAP::ByeResponseError)948:in `receive_responses': * BYE
Autologout; idle for too long
from /usr/lib/ruby/1.8/net/imap.rb:932:in `synchronize'
from /usr/lib/ruby/1.8/net/imap.rb:932:in `receive_responses'
from /usr/lib/ruby/1.8/net/imap.rb:917:in `initialize'
from /usr/lib/ruby/1.8/net/imap.rb:916:in `start'
from /usr/lib/ruby/1.8/net/imap.rb:916:in `initialize'
from test.rb:11:in `new'
from test.rb:11:in `tryIMAP'
from test.rb:143
from test.rb:100:in `each'
from test.rb:100
from test.rb:89:in `each'
from test.rb:89
from test.rb:88:in `open'
from test.rb:88
How can I catch these errors?
···
--
Posted via http://www.ruby-forum.com/.
Russell Fulton wrote:
Hi,
I have a program that I am using to do password auditing on various
IMAP servers. It defines this method:
def tryIMAP (host, usessl, user, pass)
proto = usessl ? "IMAPS" : "IMAP"
begin
imap = Net::IMAP.new(host, usessl ? 993 : 143, usessl)
rescue => e
imap.disconnect if imap
STDERR.print "#{host} #{proto} #{e.to_s}\n";
raise RuntimeError, "#{proto} failed"
end
begin
imap.login( user, pass)
imap.logout
imap.disconnect
'success'
rescue Net::IMAP::NoResponseError
'failure'
end
end
But the rescue clause does not catch all errors:
(Net::IMAP::ByeResponseError)948:in `receive_responses': * BYE
Autologout; idle for too long
[snip]
How can I catch these errors?
Change the rescue-line to:
rescue Net::IMAP::NoResponseError, Net::IMAP::ByeResponseError, Net::IMAP::BadResponseError
and so on. Maybe it helps to rescue Net::IMAP::Error only, but can't
have a look at the implementation of the other exceptions at the moment.
HTH
Stefan
Stefan Mahlitz wrote:
Thanks for your response Stefan!
How can I catch these errors?
Change the rescue-line to:
rescue Net::IMAP::NoResponseError, Net::IMAP::ByeResponseError, Net::IMAP::BadResponseError
That was going to be my next try. Hmmm.... last time I tried putting
more than one exception on a rescue statement I got a syntax error??
I'll try again -- must have been some other issue.
and so on. Maybe it helps to rescue Net::IMAP::Error only, but can't
have a look at the implementation of the other exceptions at the moment.
Just a check on my understanding of how things *should* work:
I thought that an unadorned "rescue" *should* catch *all* exceptions.
Is this correct? Should I file a bug report? Where to?
Russell
···
--
Posted via http://www.ruby-forum.com/.
Russell Fulton wrote:
Stefan Mahlitz wrote:
Thanks for your response Stefan!
How can I catch these errors?
Change the rescue-line to:
rescue Net::IMAP::NoResponseError, Net::IMAP::ByeResponseError, Net::IMAP::BadResponseError
That was going to be my next try.
I have now tried this and it still throws the exception with an explicit
rescue for that error.
Russell
···
--
Posted via http://www.ruby-forum.com/.
Russell Fulton wrote:
Stefan Mahlitz wrote:
Thanks for your response Stefan!
How can I catch these errors?
Change the rescue-line to:
rescue Net::IMAP::NoResponseError, Net::IMAP::ByeResponseError, Net::IMAP::BadResponseError
That was going to be my next try. Hmmm.... last time I tried putting
more than one exception on a rescue statement I got a syntax error??
I'll try again -- must have been some other issue.
and so on. Maybe it helps to rescue Net::IMAP::Error only, but can't
have a look at the implementation of the other exceptions at the moment.
Just a check on my understanding of how things *should* work:
I thought that an unadorned "rescue" *should* catch *all* exceptions.
Is this correct? Should I file a bug report? Where to?
No, it will only catch all Exceptions that are derived from
StandardError (as I read Pickaxe II, page 108).
Figure 8.1 on page 109 could be helpful.
The exception gets thrown in
imap = Net::IMAP.new(host, usessl ? 993 : 143, usessl)
as the backtrace tells:
...
from /usr/lib/ruby/1.8/net/imap.rb:916:in `initialize'
from test.rb:11:in `new'
from test.rb:11:in `tryIMAP'
...
and on line 12 is only the standard rescue
rescue => e
If you add the IMAP-Exceptions there it should work (and raise a
RuntimeException).