如何在未直接安装MySQL连接器的Python主包中处理子包特定异常?
最优解决方案
推荐方案:让Child包暴露需要的MySQL异常类
直接在Child包里把要用到的MySQL异常类导出来,这样Main包不用碰mysql-connector-python,直接从Child拿异常就行。
比如在Child包新建个exceptions.py文件:
# Child/exceptions.py from mysql.connector.errors import ( DatabaseError, OperationalError, IntegrityError # 挑你实际要处理的异常类导入 )
然后在Child的__init__.py里把这些异常对外暴露:
# Child/__init__.py from .exceptions import DatabaseError, OperationalError, IntegrityError
之后在Main包里就这么用:
# Main包代码 from Child import some_mysql_function from Child import OperationalError try: some_mysql_function() except OperationalError as err: # 处理异常逻辑 print(f"MySQL操作出错了: {err}")
为啥这个方案最好?
- 完全符合依赖逻辑:Main只需要依赖Child,
mysql-connector-python跟着Child一起装,不用在Main的依赖里额外加。 - 代码耦合低:Main不用关心MySQL连接器的细节,只认Child给的异常接口就行,以后Child换连接器(比如换成mysqlclient),Main代码不用改。
- 维护起来省心:所有和MySQL相关的依赖、异常都在Child里统一管理。
备选方案:Main里动态导入异常(不推荐)
如果不想改Child的代码,也可以在Main里动态导入异常类,避免模块顶层导入报错:
# Main包代码 from Child import some_mysql_function try: some_mysql_function() except Exception as err: # 用到的时候才导入异常类 try: from mysql.connector.errors import OperationalError if isinstance(err, OperationalError): print(f"MySQL操作出错: {err}") else: # 不是目标异常就重新抛出 raise except ImportError: # 极端情况:mysql-connector没装上(理论上不会发生,因为Child依赖它) raise
这个方案的问题:
- 代码嵌套多,可读性差。
- 硬依赖mysql-connector的异常结构,以后Child换连接器,Main代码直接失效。
最后补一下Poetry的依赖配置
Child的pyproject.toml要正确声明mysql依赖:
# Child/pyproject.toml [tool.poetry.dependencies] python = "^3.8" mysql-connector-python = "^8.0.33"
Main的pyproject.toml只需要加Child的依赖就行:
# Main/pyproject.toml [tool.poetry.dependencies] python = "^3.8" Child = { path = "../Child" } # 要是Child已经传到PyPI就写版本号,比如"^1.0.0"
这样装Main的时候,Poetry会自动把Child和它带的mysql-connector-python一起装上,不用你额外操作。
内容的提问来源于stack exchange,提问作者michaelgr22
相关产品推荐
相关产品推荐

