在`try-except`语句中,多个`except`语句的执行顺序是怎样的?

在`try-except`语句中,多个`except`语句的执行顺序是怎样的?

编程文章jaq1232025-05-24 12:43:001A+A-

有位道友问:try-except`语句中,多个`except`语句的执行顺序

下面就给大家一块说下:

在Python的try-except语句中,多个except子句的执行顺序遵循以下规则:

  1. 自上而下的匹配顺序
    当try块中的代码引发异常时,解释器会
    按代码书写顺序依次检查每个except子句,直到找到第一个与异常类型匹配的子句。
  2. 匹配即终止
    一旦某个except子句匹配成功(异常类型相符或其父类),对应的处理代码会立即执行,后续的except子句
    不再被检查
  3. 继承关系的影响
  4. 若异常是某个类的子类,则会被该类的except子句捕获。
  5. 因此,应先捕获子类异常,再捕获父类异常,否则父类except会拦截子类异常。

示例说明

错误顺序(父类在前):

try:
    raise ValueError("示例错误")
except Exception as e:  # 父类Exception在前
    print("捕获到通用异常")
except ValueError as e:  # 子类在后(永远不会执行)
    print("捕获到ValueError")

输出:

捕获到通用异常

正确顺序(子类在前):

ry:
    raise ValueError("示例错误")
except ValueError as e:  # 子类在前
    print("捕获到ValueError")
except Exception as e:  # 父类在后(兜底处理其他异常)
    print("捕获到通用异常")

输出:

捕获到ValueError

最佳实践

  1. 从具体到通用
    按异常类型的继承层次,将
    最具体的异常类型(子类)放在前面,通用异常(如Exception)放在最后作为兜底。
  2. 合并同类异常
    若需统一处理多个无继承关系的异常,可用元组合并:
except (TypeError, ValueError) as e:
    print("类型或值错误")
  1. 谨慎使用except Exception
    避免在最前面使用宽泛的except Exception,否则会掩盖更具体的异常处理逻辑。

总结

except子句的顺序直接影响异常处理的准确性。通过合理排序(具体→通用),能确保代码精准捕获目标异常,同时保留通用异常作为最终保障。

点击这里复制本文地址 以上内容由jaq123整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

苍茫编程网 © All Rights Reserved.  蜀ICP备2024111239号-21