使用urllib.error进行请求异常处理
请求异常通常可分为:
- 网络异常
- 服务器异常
- 资源异常
- ......
urllib.error
python的urllib标准库的error子模块包含了URLError
、HTTPError
、ContentTooShortError
3类,分别处理当URL无法打开时抛出的异常、当HTTP请求失败时抛出的异常(继承自URLError)和当下载内容比预期短时抛出的异常。详细信息见官网https://docs.python.org/3.12/library/urllib.error.html
try...except...
在python中try
和except
语句是异常处理机制的核心部分,用于处理程序运行时可能发生的错误(异常)。异常处理允许程序在遇到错误时能返回非异常的返回值,而不是崩溃。其中,try块是希望监控错误的代码块,如果发生了异常,python会终止执行try块中的剩余代码。except块用来捕获和处理try块中发生的异常,可以指定捕获的异常类型,如果不指定异常类型则会捕获所有异常。格式为(伪代码):
try:
尝试执行的代码块
# 如果代码块中发生异常将跳转到except部分
except error_a as e:
当try语句块发生error_a异常时执行的代码
# e是异常实例,可以用来获取错误信息
except error_b as e:
当try语句块发生error_b异常时执行的代码
# 可以捕获多个不同类型的异常
else:
如果try语句块的代码没有发生异常执行时的代码
finally:
无论是否发生异常都会执行的代码
# 常用于清理资源,如关闭文件或网络连接
以状态码为404的的请求异常(服务器找不到资源,url无法打开)为例:
from urllib.request import Request, urlopen
from fake_useragent import UserAgent
from urllib.error import URLError
# 错误的请求地址
url = 'https://www.bazhuayu.com/helpc'
# 封装请求头
headers = {'user-agent': UserAgent().chrome}
# 创建Request对象
req = Request(url, headers=headers)
# 异常处理 HTTPError是URLError的子类,所以URLError的except块也能捕获HTTPError异常
try:
resp = urlopen(req)
except URLError as e:
print(e)
print(type(e))
else:
print(resp.read().decode())
运行结果
HTTP Error 404: Not Found
<class 'urllib.error.HTTPError'>
调试功能
pychram和vscode都提供了强大的调试工具,帮助开发者在编写和测试代码时更容易发现和修复错误。不仅可以查看变量的值,还可以查看变量的属性和方法,可以深入了解对象的状态和行为。例如URLError的实例e为HTTPError类,包含args、characters_written、code、errno等属性,在变量面板能查看对象e有哪些属性以及属性的值,也可以在except块中添加代码例如添加print(e.code)
查看返回的HTTP状态码。
vscode简单调试
pycharm简单调试