文章目录

  • 1.URLError
  • 2.HTTPError
  • 3.网页异常的标准写法

1.URLError

  • 当我们的 urlopen() 方法无法处理一个响应的时候,就会引发一个 URLError 的异常,通常在没有网络连接、或者对方服务器压根就不存在的时候,就会引发这个异常,同时,这个 URLError 的异常会同时伴随给一个 reason 属性,用于包含由错误编码和错误信息组成的元组。
  • eg:尝试访问一个不存在的域名:http://www.cug123.edu.cn/)
    (URLError 是包含在 urllib.error 模块里面的)
>>> import urllib.request
>>> import urllib.error
>>> req = urllib.request.Request("http://www.cug123.edu.cn/")
>>> try:
	urllib.request.urlopen(req)
except urllib.error.URLError as e:
	print(e.reason)
  • 结果
    [Errno 11001] getaddrinfo failed

错误号是 11001,伴随的错误信息是 获取地址信息失败。(因为压根没有这个域名)

2.HTTPError

  • HTTPError 是 URLError 的一个子类,服务器上每一个 http 的响应都会返回一个数字的状态码
    4XX是客户端问题
    5XX是服务器的问题
    其他状态码见:小甲鱼http状态码大全
  • eg:我们当出现一个错误的时候,服务器就会返回一个 HTTP 错误号和错误的页面,你可以使用 HTTPError 实例对象作为页面返回的响应对象,它同样也拥有 read() 和 geturl() 或者说info() 这类方法
>>> import urllib.request
>>> import urllib.error
>>> req = urllib.request.Request("http://www.fishc.com/ooxx.html")
>>> try:
	urllib.request.urlopen(req)
except urllib.error.HTTPError as e:
	print(e.code)
	print(e.read())
    print(e.reason)
  • 结果:
404
b'<html>\r\n<head><title>404 Not Found</title></head>\r\n<body bgcolor="white">\r\n<center><h1>404 Not Found</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n'
Not Found

3.网页异常的标准写法

  • 第一种写法
    这一种写法有一点需要注意的就是:except HTTPError 必须写在 except URLError 的前面,这样才会响应到 HTTPError ,因为 HTTPError是 URLError 的子类,如果 except URLError 写在前面,那么 except HTTPError 永远都响应不了
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request(someurl)
try:
    response = urlopen(req)
except HTTPError as e:
    print('The server couldn\'t fulfill 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
  • 第二种写法
    第二种方法就是 先看有没有错误(包括URLError 和 HTTPError ),只要有 其中一个,就会打印 reason, 然后继续判断是否有 code ,如果有 code,就是 HTTPError ,然后也把 code 打印出来。
from urllib.request import Request, urlopen
from urllib.error import URLError
req = Request(someurl)
try:
    response = urlopen(req)
except URLError as e:
    if hasattr(e, 'reason'):
        print('We failed to reach a server.')
        print('Reason: ', e.reason)
    if hasattr(e, 'code'):
        print('The server couldn\'t fulfill the request.')
        print('Error code: ', e.code)
else:
# everything is fine
  • 参考:第061讲: 论一只爬虫的自我修养9:异常处理 | 学习记录(小甲鱼零基础入门学习Python)