HTTPError是URLError的子类,它抛出的异常是更为具体地指向HTTP URLs.
URLError
通常,URLError之所以会抛出异常,有可能因为没有网络连接(即没有连接到指定的服务器),或者是指定的服务器不存在。
在这种情况下,异常的抛出带有一个‘reason’的属性,这是一个tuple包含一个错误代码(error code) 和一个文本错误信息(text error message).
捕获异常写法:
>>> req = urllib2.Request('http://www.pretend_server.org')
>>> try: urllib2.urlopen(req)
>>> except URLError, e:
>>> print e.reason
HTTPError
每一个服务器的HTTP响应都有一个数字状态码(status code)。
这些状态码有的表示服务器无法完成请求,如果无法处理,urlopen会抛出HTTPError。典型的错误包括404(页面没有找到),403(请求被禁止),401(验证请求)。
这种情况下,HTTPError抛出的异常带有一个整数的‘code’属性
这些状态码被分为五类:
100-199 用于指定客户端应相应的某些动作。
200-299 用于表示请求成功。
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
400-499 用于指出客户端的错误。
500-599 用于支持服务器错误。
可以使用HTTPError实例作为网页return的响应(response),这也就意味着它不仅有code属性,也有read,geturl,info这些方法.
>>> try:
>>> urllib2.urlopen(req)
>>> except URLError, e:
>>> print e.code
>>> print e.read()
封装
编写HTTPError和URLError的两种基本写法,原作者更喜欢第二种。
第一种:
from urllib2 import Request, urlopen, URLError, HTTPError
req = Request(someurl)
try:
response = urlopen(req)
except HTTPError, e:
print 'The server couldn\'t fulfill the request.'
print 'Error code: ', e.code
except URLError, e:
print 'We failed to reach a server.'
print 'Reason: ', e.reason
else:
# everything is fine
#需注意的是HTTPError是URLError的子类,必须先写在前面
from urllib2 import Request, urlopen, URLError
req = Request(someurl)
try:
response = urlopen(req)
except URLError, e:
if hasattr(e, 'reason'):
print 'We failed to reach a server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'The server couldn\'t fulfill the request.'
print 'Error code: ', e.code
else:
# everything is fine
URLError其实也是IOError的子类,这意味着你也可以把上面代码的URLError换成IOError
info 和 geturl
urlopen返回的响应(或者可以说是HTTPError的实例)除了可以用read(),还可以用info和geturl方法。
geturl:
这个会返回页面真正的URL。这是因为urlopen(或者opener对象)可以采用重定向,返回网页的URL可能和请求时的URL不一样。
info:
会返回一个dictionary-like对象来描述网页,尤其是服务器传送的headers。
典型的headers包括‘Content-length’,‘Content-type’等等。