【发布时间】:2011-10-25 08:42:27
【问题描述】:
由于默认处理程序处理重定向(300 范围内的代码),而 100-299 范围内的代码表示成功,您通常只会看到 400-599 范围内的错误代码。
还有下面的代码
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
使用代码 201(已创建)引发 HTTPError:
ERROR 2011-08-11 20:40:17,318 __init__.py:463] HTTP Error 201: Created
那么为什么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...?
但这似乎不是预期的行为,基于文档和我找不到关于这种奇怪行为的类似问题的事实。
另外,else 块应该期待什么? 如果成功的状态码都被解释为HTTPErrors,那么urllib2.urlopen() 什么时候只返回一个普通的文件状响应对象就像所有 urllib2 文档所指的一样?
【问题讨论】:
-
在 201-299 之间看到响应代码真的很不寻常。 urllib2 没有完美地处理它们并不奇怪。
-
我错过了什么吗? 201 对我来说很好用……
-
@Santa,根据 dcrosta 的回答,也许您使用的是非标准处理程序?
-
@Leopd:确实如此。查看 Python27\Lib 中的当前 urllib2.py 源代码,第 511-3 行。
-
当
try块成功执行时,最后的else语句将被执行——如果有帮助的话,你可以把它读成if exception: else:。
标签: python urllib2 http-status-codes