rub*_*gly 17 python urllib2 http-status-codes
根据urllib2文档,
由于默认处理程序处理重定向(300范围内的代码),并且100-299范围内的代码表示成功,因此通常只能看到400-599范围内的错误代码.
然而,以下代码
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
Run Code Online (Sandbox Code Playgroud)
使用代码201(已创建)引发HTTPError:
ERROR 2011-08-11 20:40:17,318 __init__.py:463] HTTP Error 201: Created
Run Code Online (Sandbox Code Playgroud)
那么为什么要urllib2
在这个成功的请求上抛出HTTPErrors呢?
这不是太痛苦; 我可以轻松地将代码扩展到:
try:
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
except HTTPError, e:
if e.code == 201:
# success! :)
else:
# fail! :(
else:
# when will this happen...?
Run Code Online (Sandbox Code Playgroud)
但这似乎不是预期的行为,基于文档和我无法找到关于这种奇怪行为的类似问题的事实.
此外,该else
块应该期待什么?如果成功的状态代码都被解释为HTTPError
s,那么什么时候urllib2.urlopen()
只返回一个类似于文件的正常响应对象,就像所有urllib2
文档所指的那样?
dcr*_*sta 16
您可以编写一个自定义Handler
类来使用,urllib2
以防止引发特定的错误代码HTTError
.这是我以前用过的一个:
class BetterHTTPErrorProcessor(urllib2.BaseHandler):
# a substitute/supplement to urllib2.HTTPErrorProcessor
# that doesn't raise exceptions on status codes 201,204,206
def http_error_201(self, request, response, code, msg, hdrs):
return response
def http_error_204(self, request, response, code, msg, hdrs):
return response
def http_error_206(self, request, response, code, msg, hdrs):
return response
Run Code Online (Sandbox Code Playgroud)
然后你就可以使用它:
opener = urllib2.build_opener(self.BetterHTTPErrorProcessor)
urllib2.install_opener(opener)
req = urllib2.Request(url, data, headers)
urllib2.urlopen(req)
Run Code Online (Sandbox Code Playgroud)
正如实际的库文档提到的:
对于 200 个错误代码,立即返回响应对象。
对于非 200 错误代码,这只是通过 OpenerDirector.error() 将作业传递给 protocol_error_code 处理程序方法。最终,如果没有其他处理程序处理错误,urllib2.HTTPDefaultErrorHandler 将引发 HTTPError。
http://docs.python.org/library/urllib2.html#httperrorprocessor-objects
归档时间: |
|
查看次数: |
7793 次 |
最近记录: |