一、URLrror
当我们的urlopen无法处理一个响应的时候就会出现一个urlerror的错误,但同时url会伴随一个res的属性,包含一个由错误编码和错误信息url
举例:
import urllib.error import urllib.request req = urllib.request.Request("http://www.ooxx-fishc.com") try: urllib.request.urlopen(req) except urllib.error.URLError as e: print(e.reason) [Errno 8] nodename nor servname provided, or not known >>> #没有这个域名,所以采用异常处理
二、 HTTPError
HTTPError 是 URLError 的子类,服务器上每一个 HTTP 的响应都包含一个数字的“状态码”。
有时候状态码会指出服务器无法完成的请求类型,一般情况下 Python 会帮你处理一部分这类响应(例如,响应的是一个“重定向”,要求客户端从别的地址来获取文档,那么 urllib 会自动为你处理这个响应。);但是呢,有一些无法处理的,就会抛出 HTTPError 异常。这些异常包括典型的:404(页面无法找到),403(请求禁止)和 401(验证请求)。
因为 Python 默认会自动帮你处理重定向方面的内容(状态码 300 ~ 399 范围),状态码 100 ~ 299 的范围是表示成功,所以你需要关注的是 400 ~ 599 这个范围的状态码(因为它们代表响应出了问题)。
其中,出现 4xx 的状态码,说明问题来自客户端,就是你自己哪里做错了;出现 5xx 的状态码,那就表示与你无关了,是来自服务器的问题。
参考文档:https://fishc.com.cn/thread-103840-1-5.html
三、处理异常的两种写法
第一种: from urllib.request import Request,urlopen from urllib.error import URLError,HTTPError req = Request(someurl) try: resposen = urlopen(req) except HTTPError as e: print('The server couldn\'t fullfill the request') print('Error code :',e.code) except URLError as e: print('We failed to reach a server.') print('Reason: ',e.reason) else: everything is fine #需要注意,HTTPError 是要写在URLError前面,因为URLError包含HTTPError
第二种写法: from urllib.request import Request,urlopen from urllib.error import URLError,HTTPError req = Request(someurl) try: resposen = urlopen(req) except URLError as e: if hasattr(e,'reason'): print('We failed to reach a server.') print('Reason',e.reason) elif hasattr(e,'code'): print('The server could\'t fullfill the request') print('Error code:',e.code) else: everything is fine #有异常,如果有异常的原因把异常的原因打印出来,如果有code同时也把code打印出来