- urllib.error文档:https://docs.python.org/3/library/urllib.error.html#module-urllib.error
- urllib 的 error 模块定义了由 request 模块产生的异常。如果出现了问题,request 模块便会抛出 error 模块中定义的异常
一、异常类
- URLError
由 request 模块产生的异常都可以通过 urllib.error.URLError 来捕获,是 error 模块的基类。它是OSError
的一个子类。
属性:
- reason 返回错误原因
- 实例
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen('http://www.test.cn/')
except urllib.error.URLError as e:
print(e)
print(e.reason) # reason 属性可以返回错误原因
HTTP Error 500: Internal Privoxy Error
Internal Privoxy Error
- HTTPError
是URLError
的一个子类,通常用来处理HTTP请求错误,例如请求身份验证失败。
属性:
- code,返回 HTTP Status Code,即状态码,比如 404 网页不存在,500 服务器内部错误等等。
- reason,同父类一样,返回错误的原因。
- headers,返回 Response Headers。
- 实例
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen('http://www.test.cn/')
except urllib.error.HTTPError as e:
# print(e)
print(e.reason)
print()
print(e.code)
print()
print(e.headers)
Internal Privoxy Error
500
Content-Length: 744
Content-Type: text/html
Cache-Control: no-cache
Date: Wed, 02 May 2018 10:17:06 GMT
Last-Modified: Wed, 02 May 2018 10:17:06 GMT
Expires: Sat, 17 Jun 2000 12:00:00 GMT
Pragma: no-cache
Connection: close
二、完整代码实例
- 实例1 -- 访问https
import urllib.request
import urllib.error
import socket
try:
response = urllib.request.urlopen('https://www.baidu.com', timeout=0.01) # 访问https
# response = urllib.request.urlopen('http://www.baidu.com', timeout=0.01)
except urllib.error.HTTPError as e:
# print(e)
print(e.reason)
print(e.code)
print(e.headers)
except urllib.error.URLError as e:
print(e)
print(e.reason) # 这里reason属性返回的不再是字符串, 而是一个对象
print(type(e.reason))
if isinstance(e.reason, socket.timeout):
print('time out error')
except Exception as e:
print(e)
print(1)
<urlopen error _ssl.c:733: The handshake operation timed out>
_ssl.c:733: The handshake operation timed out
<class 'socket.timeout'>
time out error
- 实例2 -- 访问http
import urllib.request
import urllib.error
import socket
try:
# response = urllib.request.urlopen('https://www.baidu.com', timeout=0.01)
response = urllib.request.urlopen('http://www.baidu.com', timeout=0.01) # 访问http
except urllib.error.HTTPError as e:
# print(e)
print(e.reason)
print(e.code)
print(e.headers)
except urllib.error.URLError as e:
print(e)
print(e.reason) # 这里reason属性返回的不再是字符串, 而是一个对象
print(type(e.reason))
if isinstance(e.reason, socket.timeout):
print('time out error')
except Exception as e:
print(e)
print(1)
timed out
1
- 由以上2个实例可以发现,有些网站(目前只发现百度这样),当访问 https 链接时,timeout 异常会被 urllib.error.URLError 捕获,访问 http 链接时,timeout 异常则不会被 urllib.error.URLError 捕获
网友评论