Forum: Ruby Net::imap exceptions

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
9528ea68a2efbf9093b1d41f7f269f36?d=identicon&s=25 Russell Fulton (Guest)
on 2006-01-24 04:56
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?
428f96cc689eb7419bba3a8bbfcc222a?d=identicon&s=25 Stefan Mahlitz (Guest)
on 2006-01-24 08:13
(Received via mailing list)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Russell Fulton wrote:
>      imap.disconnect if imap
>   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
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (MingW32)

iD8DBQFD1dLM9S2Eui6zfdQRAiiRAJ9CMxchp2129sP5srKNpFHhEUIIgQCfU+ov
4bEy3i+wvmei5HvOR8RYDKk=
=Y0JS
-----END PGP SIGNATURE-----
9528ea68a2efbf9093b1d41f7f269f36?d=identicon&s=25 Russell Fulton (Guest)
on 2006-01-24 20:05
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
9528ea68a2efbf9093b1d41f7f269f36?d=identicon&s=25 Russell Fulton (Guest)
on 2006-01-25 00:52
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
428f96cc689eb7419bba3a8bbfcc222a?d=identicon&s=25 Stefan Mahlitz (Guest)
on 2006-01-26 20:43
(Received via mailing list)
Russell Fulton wrote:
> 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).
9528ea68a2efbf9093b1d41f7f269f36?d=identicon&s=25 Russell Fulton (Guest)
on 2006-01-26 21:34
Stefan Mahlitz wrote:
>
> No, it will only catch all Exceptions that are derived from
> StandardError (as I read Pickaxe II, page 108).
>
Ah! missed that, my bad!

Thanks Stefan!
This topic is locked and can not be replied to.