美文网首页
2. Urllib -- urllib.error

2. Urllib -- urllib.error

作者: 江湖十年 | 来源:发表于2018-06-14 11:26 被阅读67次

一、异常类

  1. 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
  1. 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 捕获

相关文章

网友评论

      本文标题:2. Urllib -- urllib.error

      本文链接:https://www.haomeiwen.com/subject/vaicrftx.html