Python捕获异常时如何同时执行特定异常处理与通用代码
实现方法
你当前代码的问题是通用处理逻辑ABunchOfLinesThatSaysGoTrain()在每个异常分支重复编写,后续如果要修改通用逻辑很容易漏改。要满足「不同异常执行专属逻辑+所有捕获到的异常都执行固定通用逻辑」的需求,有两种成熟的实现方案,根据场景选择即可:
方案1:抽离通用逻辑(可读性最高,推荐)
把重复的通用处理代码封装成独立函数,在每个异常分支的专属逻辑执行完成后,调用这个通用函数即可。这种写法逻辑最清晰,后续新增异常分支也不容易出错,适合分支专属逻辑差异较大的场景。
示例代码:
def go_train_prompt(): ABunchOfLinesThatSaysGoTrain() try: JumpOverFence() except TooShortError: print("Wow, you're too short for this obstacle") go_train_prompt() except FellError: print("Wow, you fell! go work on your balance!") go_train_prompt()
方案2:统一捕获后分支处理(代码最简洁)
如果你需要处理的异常类型较多,不想在每个except块重复写通用函数调用,可以先把所有需要捕获的异常归为一组统一接住,先通过异常类型判断执行对应的专属处理逻辑,所有分支判断完后统一执行一次通用逻辑即可,能彻底消除重复代码。
示例代码:
try: JumpOverFence() except (TooShortError, FellError) as e: # 执行对应异常的专属处理 if isinstance(e, TooShortError): print("Wow, you're too short for this obstacle") elif isinstance(e, FellError): print("Wow, you fell! go work on your balance!") # 所有被捕获的异常都会执行以下通用逻辑 ABunchOfLinesThatSaysGoTrain()
注意避坑
不要把这类通用逻辑写到finally块中:finally块的代码无论try块是否抛出异常、抛出的异常是否被捕获,都会强制执行,如果你的需求是「只有触发了指定的、被捕获的异常时才运行通用代码,正常运行/抛出未捕获异常时不运行」,用finally会不符合预期。只有资源释放、连接关闭这类无论程序是否报错都必须执行的逻辑,才适合放到finally里。
内容的提问来源于stack exchange,提问作者iyan nazarian
相关产品推荐
相关产品推荐

