This instance will be upgraded to Heptapod 0.21.0rc3 on 2021-04-23 at 10:30 UTC+2 (a few minutes of down time)

Commit abed395f authored by Martin von Zweigbergk's avatar Martin von Zweigbergk

errors: catch urllib errors specifically instead of using safehasattr()

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?

Differential Revision: https://phab.mercurial-scm.org/D9318
parent 2eb8ad899fa6
......@@ -236,20 +236,20 @@ def callcatch(ui, func):
ui.error(_(b"(did you forget to compile extensions?)\n"))
elif m in b"zlib".split():
ui.error(_(b"(is your Python install correct?)\n"))
except util.urlerr.httperror as inst:
ui.error(_(b"abort: %s\n") % stringutil.forcebytestr(inst))
except util.urlerr.urlerror as inst:
try: # usually it is in the form (errno, strerror)
reason = inst.reason.args[1]
except (AttributeError, IndexError):
# it might be anything, for example a string
reason = inst.reason
if isinstance(reason, pycompat.unicode):
# SSLError of Python 2.7.9 contains a unicode
reason = encoding.unitolocal(reason)
ui.error(_(b"abort: error: %s\n") % stringutil.forcebytestr(reason))
except (IOError, OSError) as inst:
if util.safehasattr(inst, b"code"): # HTTPError
ui.error(_(b"abort: %s\n") % stringutil.forcebytestr(inst))
elif util.safehasattr(inst, b"reason"): # URLError or SSLError
try: # usually it is in the form (errno, strerror)
reason = inst.reason.args[1]
except (AttributeError, IndexError):
# it might be anything, for example a string
reason = inst.reason
if isinstance(reason, pycompat.unicode):
# SSLError of Python 2.7.9 contains a unicode
reason = encoding.unitolocal(reason)
ui.error(_(b"abort: error: %s\n") % stringutil.forcebytestr(reason))
elif (
if (
util.safehasattr(inst, b"args")
and inst.args
and inst.args[0] == errno.EPIPE
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment