数据库操作失败时应抛出何种异常?
异常层级结构
Python拥有一套完善的内置异常类层级体系,可帮助我们在不同场景下选择合适的异常类型。
如何确定数据库操作未完成时应抛出何种异常?
通用异常的做法
最直接但不够精准的方式是抛出通用的Exception,示例代码如下:
insert = collection.insert_one(foo) if insert.acknowledged: logger.info(f'data saved: {foo}') else: raise Exception('data not saved')
这种方式的问题在于通用异常没有明确的语义,调用方很难针对性地捕获和处理这类特定的数据库操作失败场景。
推荐的特定异常
针对数据库操作未完成的场景,有几种被广泛认可的内置异常可选:
OSError:Python 3中合并了原IOError,数据库写入本质属于IO操作,因连接问题、权限不足等导致的写入未完成都可以抛出该异常RuntimeError:当操作在运行时无法完成,且没有更贴合的特定异常时,可使用该异常来标记运行时故障- 此外,多数数据库驱动(如PyMongo)会提供自身的异常体系,比如
PyMongoError及其子类(WriteError、DuplicateKeyError等),这些异常专门针对数据库操作场景,语义更明确,优先推荐使用
如果内置异常和驱动提供的异常都无法满足需求,你也可以自定义异常类,继承自Exception或更具体的内置异常,让异常信息更贴合业务场景。
内容的提问来源于stack exchange,提问作者user11330490
相关产品推荐
相关产品推荐

