news 2026/3/23 3:09:12

8.6 错误和异常

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
8.6 错误和异常

文章目录

  • 前言
  • 一、错误与异常概述
    • 1.1 错误(Errors)
    • 1.2 异常(Exceptions)
  • 二、Python 内置异常体系
    • 2.1 异常层次结构
    • 2.2 常见异常类型详解
  • 三、异常处理机制
    • 3.1 基本 try-except 语句
    • 3.2 完整的异常处理结构

前言

本文主要介绍了错误与异常概念、Python内置异常体系以及异常处理机制等知识点。


一、错误与异常概述

在编程中,程序中的错误通常被称为 bug。程序员的日常工作不仅包括修复自己代码中的 bug,也需要处理他人代码和遗留系统中的问题。可以说,bug 的处理贯穿了整个程序员职业生涯。

在 Python 中,我们通常将 bug 分为两类:

1.1 错误(Errors)

错误通常指程序中的语法错误或逻辑错误。

语法错误示例:

python# 语法错误 - if 语句缺少冒号# 这种错误在编写时就会被编译器发现ifTrueprint("hello python")# 另一个语法错误示例 - 括号不匹配print("Hello World"

特点:

语法错误在代码编写阶段就会被 Python 解释器或 IDE(如 PyCharm、VSCode)检测出来

通常以红色波浪线或错误提示的形式显示

程序无法执行,必须先修正这些错误

逻辑错误示例:

python# 逻辑错误 - 0 不能作为除数# 这种错误只有在运行时才会被发现defdivide_numbers(a,b):returna/b result=divide_numbers(5,0)# ZeroDivisionError: division by zeroprint(result)# 另一个逻辑错误示例 - 未初始化变量defcalculate_average(numbers):total=0fornuminnumbers:total+=numreturntotal/len(numbers)# 如果numbers为空列表,会引发ZeroDivisionErrorprint(calculate_average([]))# ZeroDivisionError: division by zero

特点:

逻辑错误编译器不会提示,程序可以正常执行

只有在特定条件下运行时才会暴露

需要通过对业务逻辑的理解来避免

1.2 异常(Exceptions)

即使 Python 程序的语法完全正确,运行时仍然可能发生错误,这些运行时检测到的错误被称为异常。

python# 异常示例defopen_file(filename):file=open(filename,'r')# 如果文件不存在,会引发FileNotFoundErrorcontent=file.read()file.close()returncontent content=open_file('nonexistent.txt')# FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent.txt'

二、Python 内置异常体系

Python 的异常体系采用层次结构,所有异常都继承自 BaseException。

2.1 异常层次结构

BaseException ├── SystemExit# 解释器请求退出├── KeyboardInterrupt# 用户中断执行(通常按Ctrl+C)├── GeneratorExit# 生成器发生异常通知退出└── Exception# 常规错误的基类├── StopIteration# 迭代器没有更多值├── StopAsyncIteration# 异步迭代器停止├── ArithmeticError# 所有数值计算错误的基类│ ├── FloatingPointError# 浮点计算错误│ ├── OverflowError# 数值运算超出最大限制│ └── ZeroDivisionError# 除零错误├── AssertionError# 断言语句失败├── AttributeError# 对象没有这个属性├── BufferError# 缓冲区错误├── EOFError# 到达文件末尾├── ImportError# 导入模块失败│ └── ModuleNotFoundError# 模块未找到├── LookupError# 无效数据查询的基类│ ├── IndexError# 序列索引超出范围│ └── KeyError# 字典中不存在的键├── MemoryError# 内存溢出错误├── NameError# 未声明/初始化对象│ └── UnboundLocalError# 访问未初始化的局部变量├── OSError# 操作系统错误│ ├── FileNotFoundError# 文件未找到│ ├── PermissionError# 权限不足│ ├── TimeoutError# 操作超时│ └──...# 其他OS相关错误├── ReferenceError# 弱引用访问已回收对象├── RuntimeError# 一般运行时错误│ ├── NotImplementedError# 尚未实现的方法│ └── RecursionError# 递归深度超过限制├── SyntaxError# Python语法错误│ └── IndentationError# 缩进错误│ └── TabError# Tab和空格混用├── SystemError# 解释器系统错误├── TypeError# 对类型无效的操作├── ValueError# 传入无效的参数│ └── UnicodeError# Unicode相关错误│ ├── UnicodeDecodeError# Unicode解码错误│ ├── UnicodeEncodeError# Unicode编码错误│ └── UnicodeTranslateError# Unicode转换错误└── Warning# 警告的基类(非异常)├── DeprecationWarning# 已弃用功能的警告├── FutureWarning# 将来语义改变的警告└──...# 其他警告

2.2 常见异常类型详解

python# 常见异常类型演示defdemonstrate_common_exceptions():"""演示常见异常类型"""print("="*60)print("Python 常见异常类型演示")print("="*60)# 1. ZeroDivisionError - 除零错误print("\n1. ZeroDivisionError (除零错误):")try:result=10/0exceptZeroDivisionErrorase:print(f" 错误:{type(e).__name__}:{e}")# 2. TypeError - 类型错误print("\n2. TypeError (类型错误):")try:result="hello"+5# 字符串和数字不能直接相加exceptTypeErrorase:print(f" 错误:{type(e).__name__}:{e}")# 3. ValueError - 值错误print("\n3. ValueError (值错误):")try:number=int("abc")# 无法将"abc"转换为整数exceptValueErrorase:print(f" 错误:{type(e).__name__}:{e}")# 4. IndexError - 索引错误print("\n4. IndexError (索引错误):")try:my_list=[1,2,3]element=my_list[5]# 索引超出范围exceptIndexErrorase:print(f" 错误:{type(e).__name__}:{e}")# 5. KeyError - 键错误print("\n5. KeyError (键错误):")try:my_dict={"name":"Alice","age":25}value=my_dict["address"]# 键不存在exceptKeyErrorase:print(f" 错误:{type(e).__name__}:{e}")# 6. FileNotFoundError - 文件未找到错误print("\n6. FileNotFoundError (文件未找到错误):")try:withopen("nonexistent_file.txt","r")asf:content=f.read()exceptFileNotFoundErrorase:print(f" 错误:{type(e).__name__}:{e}")# 7. AttributeError - 属性错误print("\n7. AttributeError (属性错误):")try:my_string="hello"my_string.nonexistent_method()# 字符串没有这个方法exceptAttributeErrorase:print(f" 错误:{type(e).__name__}:{e}")# 8. ImportError - 导入错误print("\n8. ImportError (导入错误):")try:importnonexistent_moduleexceptImportErrorase:print(f" 错误:{type(e).__name__}:{e}")# 9. NameError - 名称错误print("\n9. NameError (名称错误):")try:print(undefined_variable)# 变量未定义exceptNameErrorase:print(f" 错误:{type(e).__name__}:{e}")# 10. OSError - 操作系统错误print("\n10. OSError (操作系统错误):")try:# 尝试打开不存在的目录importos os.chdir("/nonexistent/directory")exceptOSErrorase:print(f" 错误:{type(e).__name__}:{e}")# 执行演示demonstrate_common_exceptions()

三、异常处理机制

3.1 基本 try-except 语句

pythondefbasic_exception_handling():"""基本异常处理演示"""print("\n"+"="*60)print("基本异常处理:try-except 语句")print("="*60)# 示例1:未捕获异常print("\n1. 未捕获异常的情况:")defdivide_without_handling(a,b):"""未处理异常的除法函数"""returna/btry:result=divide_without_handling(10,0)print(f" 结果:{result}")exceptZeroDivisionErrorase:print(f" 捕获到异常:{type(e).__name__}:{e}")# 示例2:捕获特定异常print("\n2. 捕获特定异常:")defdivide_with_handling(a,b):"""处理异常的除法函数"""try:returna/bexceptZeroDivisionError:return"错误:除数不能为零"exceptTypeError:return"错误:参数类型不正确"print(f" 10 ÷ 2 ={divide_with_handling(10,2)}")print(f" 10 ÷ 0 ={divide_with_handling(10,0)}")print(f" 10 ÷ 'a' ={divide_with_handling(10,'a')}")# 示例3:捕获多个异常print("\n3. 捕获多个异常(元组形式):")defprocess_data(data,index):"""处理数据,可能引发多种异常"""try:value=data[index]result=100/valuereturnresultexcept(IndexError,TypeError,ZeroDivisionError)ase:returnf"处理数据时发生错误:{type(e).__name__}"data_list=[1,2,0,4]print(f" 有效数据:{process_data(data_list,0)}")print(f" 除零错误:{process_data(data_list,2)}")print(f" 索引错误:{process_data(data_list,10)}")# 示例4:捕获所有异常(不推荐,但有时必要)print("\n4. 捕获所有异常:")defsafe_operation(operation_func):"""安全执行操作,捕获所有异常"""try:returnoperation_func()exceptExceptionase:returnf"操作失败:{type(e).__name__}:{e}"# 测试各种异常operations=[lambda:10/2,# 正常lambda:10/0,# 除零错误lambda:int("abc"),# 值错误lambda:[1,2,3][10],# 索引错误]fori,opinenumerate(operations,1):result=safe_operation(op)print(f" 操作{i}:{result}")# 执行演示basic_exception_handling()

3.2 完整的异常处理结构

pythondefcomplete_exception_structure():"""完整的异常处理结构演示"""print("\n"+"="*60)print("完整的异常处理结构:try-except-else-finally")print("="*60)defprocess_file(filename):"""处理文件,演示完整的异常处理结构"""file=Nonetry:print(f"\n尝试打开文件:{filename}")file=open(filename,'r',encoding='utf-8')content=file.read()# 如果没有异常,执行else块print("文件读取成功")exceptFileNotFoundError:print(f"错误:文件 '{filename}' 未找到")returnNoneexceptPermissionError:print(f"错误:没有权限读取文件 '{filename}'")returnNoneexceptUnicodeDecodeError:print(f"错误:文件 '{filename}' 编码不正确")returnNoneexceptExceptionase:print(f"未知错误:{type(e).__name__}:{e}")returnNoneelse:# 只有在没有异常发生时执行print("else块:文件处理完成,返回内容")returncontentfinally:# 无论是否发生异常,都会执行iffile:file.close()print("finally块:文件已关闭")else:print("finally块:没有文件需要关闭")# 测试不同情况print("测试1:正常文件")content1=process_file(__file__)# 当前文件ifcontent1:print(f"读取到的内容长度:{len(content1)}字符")print("\n"+"-"*40)print("测试2:不存在的文件")content2=process_file("nonexistent_file.txt")print("\n"+"-"*40)print("测试3:权限不足的文件(在Unix-like系统上测试)")# 创建一个临时文件并修改权限importtempfileimportos temp_file=tempfile.NamedTemporaryFile(delete=False)temp_file.write(b"test content")temp_file.close()# 修改权限为只写(在某些系统上可能无效)try:os.chmod(temp_file.name,0o222)# 只写权限content3=process_file(temp_file.name)finally:# 清理临时文件os.unlink(temp_file.name)print("\n"+"-"*40)print("try-except-else-finally 执行顺序总结:")print("1. 执行 try 块")print("2. 如果发生异常,执行匹配的 except 块")print("3. 如果没有异常,执行 else 块")print("4. 无论如何,最后执行 finally 块")# 执行演示complete_exception_structure()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/14 10:16:44

VoxCPM-1.5-TTS-WEB-UI与UltraISO注册码最新版无任何关系说明

VoxCPM-1.5-TTS-WEB-UI 技术解析:高保真语音合成的工程实践 在智能语音交互日益普及的今天,用户对语音合成质量的要求早已超越“能听清”这一基本门槛,转而追求更自然、更具表现力的声音体验。从有声书朗读到虚拟主播配音,再到个性…

作者头像 李华
网站建设 2026/3/18 6:48:49

解决CP2102无法识别问题:Windows驱动深度剖析

深入排查 CP2102 无法识别问题:从硬件到驱动的全链路解析 你有没有遇到过这样的场景?手头一个看似普通的 USB 转串模块,插上电脑后设备管理器里却只显示“未知设备”或“其他设备”,甚至一会儿出现、一会儿消失。如果你正在用的是…

作者头像 李华
网站建设 2026/3/21 10:35:47

MediaMTX流媒体服务器性能优化终极指南:5个关键配置提升并发能力

MediaMTX流媒体服务器性能优化终极指南:5个关键配置提升并发能力 【免费下载链接】mediamtx 项目地址: https://gitcode.com/gh_mirrors/med/mediamtx 你是否正在为MediaMTX服务器的性能瓶颈而困扰?面对日益增长的并发用户,原有的配置…

作者头像 李华
网站建设 2026/3/22 2:34:37

NaturalReader适用人群?教育领域老牌工具

CosyVoice3:从教育到无障碍,开源语音克隆如何重塑声音体验 在一所普通中学的语文课堂上,老师正为录制课文朗读音频发愁——她希望学生听到的是自己温柔清晰的声音,而不是冷冰冰的机器音。但每天花两小时录音显然不现实。与此同时…

作者头像 李华
网站建设 2026/3/15 0:50:56

Automate Sketch 终极指南:如何快速提升设计工作效率

Automate Sketch 终极指南:如何快速提升设计工作效率 【免费下载链接】Automate-Sketch Make your workflow more efficient. 项目地址: https://gitcode.com/gh_mirrors/au/Automate-Sketch 还在为重复的设计任务烦恼吗?每天花费大量时间在图层整…

作者头像 李华
网站建设 2026/3/21 15:40:53

终极AI可视化编程指南:在Scratch中快速搭建机器学习应用

终极AI可视化编程指南:在Scratch中快速搭建机器学习应用 【免费下载链接】ml2scratch 機械学習 x スクラッチ(Connect Machine Learning with Scratch) 项目地址: https://gitcode.com/gh_mirrors/ml/ml2scratch 想要体验机器学习的魅力却担心编程门槛太高&a…

作者头像 李华