当前位置: 首页 > news >正文

Python中的异常和断言

文章目录

  • Python中的异常和断言
    • 一、异常
      • 1.什么是异常?
      • 2. Python 异常的层次结构
      • 3. 异常处理:try...except...else...finally
        • 1. 基本语法
        • 2. 实例演示
      • 4. 常见内置异常详解
      • 5. 主动抛出异常:raise
      • 6.自定义异常
      • 7. finally:资源清理的保障
      • 8. else 子句的作用
      • 9. 注意事项
      • 10. 异常链(Exception Chaining)—— Python 3 特性
      • 11. 异常对象常用属性
    • 二、断言(assert)
      • 1. 用法示例
        • 1. 最简单的断言
        • 2. 不带消息的断言
        • 3. 用于函数参数校验
      • 2. 断言的本质和底层机制
      • 3. 禁用断言:-O 优化模式
    • 断言和异常的区别
      • 推荐使用 `assert` 的场景
      • 推荐使用 `raise` 异常的场景

Python中的异常和断言

一、异常

1.什么是异常?

在程序运行过程中,如果发生错误或意外情况(如除零、文件不存在、类型不匹配等),Python 会中断当前的正常执行流程,并创建一个“异常对象”,然后尝试寻找能够“处理”这个异常的代码。这个过程叫做“抛出异常(raise an exception)”。

如果没有找到处理代码,程序会终止并打印错误信息(Traceback)

异常 ≠ 语法错误
语法错误(如拼写错误、缺少冒号)是在编译/解析阶段就被发现的,程序根本不会运行。
异常是在程序运行时(Runtime) 发生的错误。

2. Python 异常的层次结构

Python 中所有异常都继承自内置的 BaseException 类。但通常我们处理的是继承自 Exception 的异常(因为 BaseException 还包括 SystemExit, KeyboardInterrupt 等系统级异常)。

你可以通过 help('builtins') 或查阅官方文档查看完整列表。


3. 异常处理:try…except…else…finally

Python 使用 try 语句块来“捕获”并“处理”异常。

1. 基本语法
try:# 可能出错的代码risky_code()
except ExceptionType as e:# 处理特定类型的异常handle_error(e)
except AnotherException:# 处理另一种异常handle_another_error()
except:  # 不推荐!捕获所有异常(包括 KeyboardInterrupt 等)handle_anything()
else:# 如果 try 块没有发生任何异常,执行这里print("一切正常!")
finally:# 无论是否发生异常,都会执行(用于清理资源)cleanup()

尽量捕获具体的异常类型,避免裸 except:


2. 实例演示
def divide(a, b):try:result = a / bprint(f"{a} / {b} = {result}")except ZeroDivisionError as e:print(f"错误:不能除以零!({e})")except TypeError as e:print(f"错误:参数类型不正确!({e})")else:print(" 计算成功!")finally:print(" 除法操作结束。")# 测试
divide(10, 2)   # 正常
divide(10, 0)   # ZeroDivisionError
divide(10, "a") # TypeError

输出:

10 / 2 = 5.0
计算成功!
除法操作结束。
错误:不能除以零!(division by zero)
除法操作结束。
错误:参数类型不正确!(unsupported operand type(s) for /: ‘int’ and ‘str’)
除法操作结束。

4. 常见内置异常详解

异常类 触发场景 示例
ZeroDivisionError 除数为零 10 / 0
IndexError 序列索引越界 lst = [1,2]; lst[5]
KeyError 字典中键不存在 d = {'a':1}; d['b']
ValueError 传入了正确类型但不合适的值 int("hello")
TypeError 操作或函数应用于不适当类型的对象 "a" + 1
NameError 变量未定义 print(x)(x未定义)
AttributeError 对象没有该属性或方法 "abc".append()
FileNotFoundError 文件或目录不存在 open("nofile.txt")
ImportError 导入模块失败 import non_existent_module
OSError 操作系统相关错误(如权限不足) 文件操作失败

5. 主动抛出异常:raise

你可以使用 raise 语句主动抛出异常,通常用于:

  • 参数校验失败
  • 业务逻辑错误
  • 强制调用者处理某种情况
def set_age(age):if not isinstance(age, int):raise TypeError("年龄必须是整数")if age < 0 or age > 150:rais
http://www.dtcms.com/a/388764.html

相关文章:

  • java求职学习day32
  • 内存一致性模型(Memory Consistency Model)及其核心难度
  • Archery:一个免费开源的一站式SQL审核查询平台
  • 【中科院宁波材料技术与工程研究所主办】第五届机械自动化与电子信息工程国际学术会议(MAEIE 2025)
  • 政府支持再造视角下A区政府采购数字化发展问题及对策
  • 第三章:新婚
  • python+vue小区物业管理系统设计(源码+文档+调试+基础修改+答疑)
  • Android系统框架知识系列(二十二):Storage Manager Service - Android存储系统深度解析
  • 模板的特化详解
  • AI大模型:(三)1.2 Dify安装
  • nodejs+postgresql 使用存储过程和自定义函数
  • Siemens TIA Portal安装详细教程(附安装包)Siemens TIA Portal V20超详细安装教程
  • 速通ACM省铜第七天 赋源码(Sponsor of Your Problems)
  • 数据流图DFD
  • Netty ChannelHandler
  • 对比基于高斯核的2D热力图与普通Canvas热力图
  • 问题:RuntimeError: cuDNN error: CUDNN_STATUS_NOT_SUPPORTED.
  • 基于Cookie的SSO单点登录系统设计与实现
  • AXI4 协议
  • 懒删除|并查集|容斥
  • 鲁大齐专业WordPress外贸独立站建设服务商
  • 【LeetCode 每日一题】3516. 找到最近的人
  • 团体程序设计天梯赛-练习集 L1-030 一帮一
  • delphi 最大String
  • 线程安全的C++对象:深入探讨与实现
  • 关于段访问机制
  • 如何判断nmos和pmos导通和截止
  • 密码攻击技术全景:模型、方法与攻防演进
  • Avalonia跟WPF的不同点
  • 下载 | Win11 25H2 准正式版更新!(ISO映像、2025年度版本、26200.6713、Windows 11)