Python中由urllib.request引发的异常或错误都是由urllib.error这个模块处理的。

urllib.error中包含2个异常捕捉,URLErrorHTTPError(实际上还有一个,不过太不常用),需要注意HTTPErrorURLError的子类,即产生HTTPError必定首先即产生了HTTPError

URLError含有属性:reason
HTTPError含有属性:code,reason,headers

所以显然HTTPError产生仅限于出现的错误是具有HTTP错误代码的,而类似网址错误、传输数据不完整等都不会触发HTTPError

下面是一种常用的错误处理方法:

import urllib.request
import urllib.error

url = ['http://www.pcbeta.com/a.html',
       'http://b.con']
try:
    a = urllib.request.urlopen(url[1])
except urllib.error.URLError as e:
    if hasattr(e, 'code'):  # 此时是HTTPError
        print(e.code)
    elif hasattr(e, 'reason'):  # 此时是URLError
        print(e.reason)

这里利用的是HTTPError含有code属性而URLError不含有,来区别这两种异常。

下面是另一种错误处理方法:

import urllib.request
import urllib.error

url = ['http://www.pcbeta.com/a.html',
       'http://b.con']
try:
    a = urllib.request.urlopen(url[0])
except urllib.error.HTTPError as e:  # 此时是HTTPError
    print(e.code)
except urllib.error.URLError as e:  # 此时是URLError
    print(e.reason)

这里直接区别开了HTTPErrorURLError