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'])
以下是我正在使用的代码,你可以帮我指出这篇文章。
答案 0 :(得分:2)
e
是捕获的异常,这里是urllib2.URLError
类或其子类的实例。代码期望该实例定义e.read()
和e.code()
方法。
然而,它有一些错误。它实际上假设它正在捕获urllib2.HTTPError
exception,URLError
的子类。异常处理程序肯定会捕获此类异常,但它也可能是基础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响应的错误。