urllib 的异常错误处理
我们在发送请求的过程中,如果网络环境不好,或者出现了其他问题,会出现请求异常,如果不处理这些异常,程序很可能会崩溃,所以我们需要处理请求异常问题.
这里主要说的是URLError和HTTPError,以及对它们的错误处理。
URLError:来自urllib库的error模块,继承自OSError,由request模块产生的异常都可以通过捕捉这个类来处理.
产生的原因主要有
- 没有网络连接
- 服务器连接失败
- 找不到指定的服务器
它具有一个属性reason,返回错误的原因
from urllib import error,request
def check_urlerror():
"""
没有网络
服务器连接失败
找不到指定的服务器
reason:返回错误原因
"""
req_url = 'https://www.baiduxxx.com/'
try:
response = request.urlopen(url=req_url)
print(response.status)
except error.URLError as err:
"""
1.[Errno -3] Temporary failure in name resolution:
(没有网络)无法解析域名,即DNS解析配置出现问题
2.[Errno -2] Name or service not known:
未知的服务器,找不到服务器
3.timed out
请求超时
"""
print('===',err.reason)
HTTPError
HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字"响应状态码"。
专门用来处理HTTP请求错误,比如未认证,页面不存在等
有三个属性
- code:返回HTTP的状态码
- reason:返回错误原因
- headers:返回请求头
注意,urllib可以为我们处理重定向的页面(也就是3开头的响应码),100-299范围的号码表示成功,所以我们只能看到400-599的错误号码
def check_httperror():
"""
处理认证或则请求失败的错误
例如:出现404表示页面未找到等
code:返回的HTTP状态码
reason:返回的错误原因
headers:返回的请求头
:return:
"""
req_url = 'https://www.qidian.com/all/nsacnscn.htm'
try:
response = request.urlopen(url=req_url)
print(response.status)
except error.HTTPError as err:
"""
Not Found (reason)
404 (code)
Server: nginx (headers)
Date: Mon, 19 Nov 2018 13:36:11 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 15616
Connection: close
"""
print('===', err.reason,err.code,err.headers)
因为HTTPError的父类是URLError,所以我们更好的处理顺序应该是先捕获子类的错误,再捕获父类的错误
rom urllib import request,error
def check_error():
"""
因为HTTPError的父类是URLError,所以我们更好的处理顺序应该是
先捕获子类的错误,再捕获父类的错误
"""
req_url = 'https://www.baiduxxx.com/'
try:
response = request.urlopen(url=req_url)
print(response.status)
except error.HTTPError as err:
print(err.code,err.reason,err.headers)
except error.URLError as err:
print('===', err.reason)
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 302 - 资源(网页等)被临时转移到其它URL
- 401 - 未授权
- 403 - 禁止访问
- 408 - 请求超时
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
- 503 - 服务器不可用