Python多个except分支执行同一方法时如何避免代码重复
实现方案
你判断finally无法满足需求是正确的:finally块的逻辑会无条件执行——不管method()有没有抛异常、抛的是不是你要处理的两类异常,甚至try/except里执行了return/raise都会跑,完全不符合「仅捕获到ErrorType1、ErrorType2时才执行todo()」的要求。
直接合并两类异常的捕获分支,就能把todo()的重复代码去掉:
try: method() except (ErrorType1, ErrorType2) as e: todo() if isinstance(e, ErrorType1): return raise
注意:这里用裸
raise而不是你原来写的raise e,裸raise会保留完整的原始异常栈追踪,不会把异常抛出点截断到当前except块,排查问题时能看到最原始的报错链路,是Python里重抛异常的推荐写法。
如果这类逻辑在代码里复用率很高,你也可以封装成上下文管理器做统一抽象,但如果只是单次使用,上面的写法足够简单直接,没有额外的维护成本。
内容的提问来源于stack exchange,提问作者LookIntoEast
相关产品推荐
相关产品推荐

