python学习笔记 ---- 关于URLError和HTTPError

当urlopen不能处理服务器的响应时,会抛出URLError异常。

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’等等。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值