Python连接MySQL的登录门户脚本运行时持续报BaseMySQLSocket相关TypeError,异常捕获无效
报错根因
这个报错和你自己写的异常捕获逻辑完全无关,本质是mysql-connector-python库的内部代码bug:
- 触发时机:报错发生在Python解释器退出、垃圾回收回收MySQL连接对象的阶段。此时你编写的业务代码已经全部执行完成,外层的异常捕获块早已退出作用域,根本无法覆盖这个阶段抛出的错误。
- 错误本质:根据堆栈定位,问题出在库内部
network.py文件的shutdown方法第137行——库的代码写错了异常捕获逻辑,尝试把一个没有继承自BaseException的普通类当成异常类捕获,直接触发Python内置的TypeError: catching classes that do not inherit from BaseException is not allowed。 - 为啥你之前加各类捕获逻辑都没用:这个错误不在你的代码执行链路里,是库的析构函数在无上下文的GC阶段触发的,你在业务代码里加多少捕获逻辑都触达不到这个触发点。
你现在能正常执行数据库查询,也印证了这个bug不影响核心业务逻辑,只是库在做资源清理的时候出错。
可落地方案
按推荐优先级排序:
- 方案1(最省事,从根源修复):升级mysql-connector-python到8.0.29及以上版本。这个是库的已知兼容问题,官方在新版本已经修复了内部的错误捕获写法,直接执行
pip install --upgrade mysql-connector-python即可解决,不需要改动任何现有业务代码。 - 方案2(不升级版本也能解决):显式管理数据库连接的生命周期,不让解释器GC触发库的有bug的析构函数。你当前代码拿到连接后没有主动关闭,才会在退出时被GC调用存在问题的
__del__方法。调整方式很简单:查询执行完成后,显式调用connection.close()释放连接,从流程上绕开有bug的析构逻辑。调整后的调用参考代码:
connection = create_db_connection('localhost', 'root', 'GeoPlayingCode17##', 'login_details') # 防御连接创建失败的空值场景 if connection: results = read_query(connection, q1) # 用完立刻释放连接 connection.close()
- 附带修复代码里的隐藏隐患:你当前的异常捕获块中使用了
Error类,但没有从mysql.connector中显式导入,后续真遇到连接异常时会直接触发NameError,根本走不到你写的错误打印逻辑。需要在脚本开头补上导入语句:from mysql.connector import Error
内容的提问来源于stack exchange,提问作者George Osborn
相关产品推荐
相关产品推荐

