Before this patch, we would catch IOError and OSError and check if
the instance had a .code member (indicates HTTPError) or a
.reason member (indicates the more generic URLError). It seems to
me that can simply catch those exception specifically instead, so
that's what this code does. The existing code is from fbe8834923c5
(commands: report http exceptions nicely, 2005-06-17), so I suspect
it's just that there was no urllib2 (where URLError lives) back
then.
The old code mentioned SSLError in a comment. The new code does
*not* try to catch that. The documentation for ssl.SSLError says
that it has a .reason property, but `python -c 'import ssl;
print(dir(ssl.SSLError("foo", Exception("bar"))))` doesn't mention
that property on either Python 2 or Python 3 on my system. It also
seems that sslutil is pretty careful about converting ssl.SSLError
to error.Abort. It also is carefult to not assume that instances of
the exception have a .reason. So I at least don't want to catch
ssl.SSLError and handle it the same way as URLError because that
would likely result in a crash. I also wonder if we don't need to
handle it at all (because sslutil might handle all the cases). It's
now early in the release cycle, so perhaps we can just see how it
goes?
Don't we need to catch SSLError here too, since some of the code in this block deals with it? Otherwise it gets handled by the (IOError, OSError) block below, and (I guess?) gets re-raised.