Python2.x/3.x通用urllib/urllib2 IncompleteRead异常处理方案咨询
兼容Python2/3处理IncompleteRead异常的几种方案
这确实是Python跨版本开发中很常见的小问题,我给你分享几种实用的解决思路,帮你写出干净的兼容代码:
方案一:统一导入兼容模块(推荐)
最优雅的方式是在代码开头通过try-except导入模块,并给不同版本的模块起统一的别名,这样后续的业务逻辑可以完全复用,不需要分支判断。
# 先统一导入兼容的模块 try: # Python 2 环境下导入对应模块 import urllib2 as request import httplib except ImportError: # Python 3 环境下导入对应模块并别名 from urllib import request import http.client as httplib # 然后统一写业务逻辑 try: page = request.urlopen(urls).read() except httplib.IncompleteRead as e: # 两个版本的IncompleteRead都有partial属性,直接取用即可 page = e.partial
这种方法的好处是代码没有冗余,只需要在导入层做一次兼容,后续的异常捕获和业务逻辑完全一致,可读性和维护性都很高。
方案二:通过版本判断分支处理
如果你更倾向于明确区分版本逻辑,可以用sys.version_info来检查Python版本,然后分别编写对应版本的代码:
import sys if sys.version_info.major == 2: # Python 2 专属逻辑 import urllib2 import httplib try: page = urllib2.urlopen(urls).read() except httplib.IncompleteRead, e: page = e.partial else: # Python 3 专属逻辑 from urllib import request import http.client try: page = request.urlopen(urls).read() except http.client.IncompleteRead as e: page = e.partial
不过这种方式会导致代码重复,后续如果业务逻辑有变动,需要同时修改两个分支的代码,所以一般只在特殊场景下使用。
方案三:捕获通用异常超类(不推荐)
理论上可以尝试捕获IncompleteRead的超类,但两个版本中它的继承链略有差异:Python2中它继承自httplib.HTTPException,Python3中继承自http.client.HTTPException,而且最终都属于IOError/OSError体系。不过这种方式不够精准,可能会误捕获其他无关异常,所以不推荐使用。
总结下来,方案一的模块别名导入法是最简洁高效的,既能保证代码兼容性,又不会牺牲可读性。
内容的提问来源于stack exchange,提问作者hnvasa
相关产品推荐
相关产品推荐

