究竟是什么'e'以及e.code()或e.read()的作用是什么?

时间:2017-05-05 06:48:10

标签: python urllib2

try:
    response = urllib2.urlopen(request)
except urllib2.URLError as e:
    response = json.loads(e.read())
    return error(e.code(),response['errors'][0]['message'])
response = json.loads(response.read())
if 'errors' in response:
    return error(response['ErrorCode'],response['Error'])

以下是我正在使用的代码,你可以帮我指出这篇文章。

1 个答案:

答案 0 :(得分:2)

e是捕获的异常,这里是urllib2.URLError类或其子类的实例。代码期望该实例定义e.read()e.code()方法。

然而,它有一些错误。它实际上假设它正在捕获urllib2.HTTPError exceptionURLError的子类。异常处理程序肯定会捕获此类异常,但它也可能是基础URLError,在这种情况下,不会有e.read()方法!它还会尝试调用HTTPError.code,这不是方法,而是属性。

HTTP错误代码抛出HTTPError异常,因此只有当服务器有响应时才会抛出异常。 e.read()允许您从套接字读取响应正文,e.code是服务器响应的HTTP代码。来自文档:

  

虽然是一个例外(URLError的子类),但HTTPError也可以作为非特殊文件类型的返回值(与urlopen()返回的内容相同)。这在处理异常HTTP错误(例如身份验证请求)时非常有用。

要使代码在所有情况下都能正常工作,必须将其更正为:

try:
    response = urllib2.urlopen(request)
except urllib2.HTTPError as e:
    response = json.loads(e.read())
    return error(e.code, response['errors'][0]['message'])

可能还有一个额外的except urllib2.URLError as e:块来处理不涉及HTTP响应的错误。