python 异常处理

Python 异常处理完全指南

异常处理基础概念

Python 中,程序在运行过程中发生的、会让程序中断崩溃的错误,就叫做「异常(Exception)」。


一、Python 异常体系核心继承关系

所有异常的根类是 BaseException,日常开发只需关注两个核心分支:

BaseException(所有异常的父类) ├─ Exception(所有「可捕获/业务异常」的父类,99%开发场景捕获这个分支) │ ├─ 所有内置业务异常(算术/索引/键/类型/值等) │ └─ 自定义异常类(必须继承此类) ├─ KeyboardInterrupt (Ctrl+C终止程序,系统级,不建议捕获) ├─ SystemExit (sys.exit()触发程序退出,系统级,不建议捕获) └─ GeneratorExit (生成器关闭异常,系统级) 

二、高频必用异常(12 个,日常开发核心)

1. ZeroDivisionError

  • 触发原因:除法运算中除数为 0(包括 / 真除法 和 // 整除)
  • 示例代码

python

运行

10 / 0 # 报错:ZeroDivisionError: division by zero 10 // 0 # 同样触发该异常 

2. IndexError

  • 触发原因:访问序列(列表 / 元组 / 字符串 / 字节串)时,使用超出序列长度的索引值(正 / 负索引越界均触发)
  • 示例代码

python

运行

lst = [1, 2, 3] # 最大正索引2,最小负索引-3 lst[5] # 报错:IndexError: list index out of range str1 = "python" str1[-8] # 报错:IndexError: string index out of range 

3. KeyError

  • 触发原因:访问字典中不存在的键,字典仅支持通过已存在的键取值
  • 示例代码

python

运行

dic = {"name": "python", "age": 30} dic["gender"] # 报错:KeyError: 'gender' 

4. TypeError

  • 触发原因:数据类型不匹配 / 类型不支持当前操作,Python 最常见异常之一
  • 示例代码

python

运行

"hello" + 100 # 报错:TypeError: can only concatenate str (not "int") to str [1,2] + (3,4) # 报错:TypeError: can only concatenate list (not "tuple") to list max(10, "20") # 报错:TypeError: '>' not supported between instances of 'str' and 'int' for i in 123: pass # 报错:TypeError: 'int' object is not iterable 

5. ValueError

  • 触发原因:数据类型正确,但传入的值不合法 / 不符合函数要求(与 TypeError 为兄弟异常)
  • 示例代码

python

运行

int("abc") # 报错:ValueError: invalid literal for int() with base 10: 'abc' float("python") # 报错:ValueError: could not convert string to float: 'python' lst = [1,2,3] lst.remove(99) # 报错:ValueError: list.remove(x): x not in list 

6. FileNotFoundError

  • 触发原因:使用 open() 以读模式(r/r+/rb)打开不存在的文件(写模式会新建文件,不触发)
  • 示例代码

python

运行

open("不存在的文件.txt", "r", encoding="utf-8") # 报错:FileNotFoundError: [Errno 2] No such file or directory: '不存在的文件.txt' 

7. AttributeError

  • 触发原因:访问对象(类 / 实例)中不存在的属性或方法
  • 示例代码

python

运行

str1 = "hello" str1.abc # 报错:AttributeError: 'str' object has no attribute 'abc' lst = [1,2] lst.add(3) # 报错:AttributeError: 'list' object has no attribute 'add'(列表应为append) 

8. NameError

  • 触发原因:使用未定义、未赋值的变量名 / 函数名 / 类名
  • 示例代码

python

运行

print(num) # 报错:NameError: name 'num' is not defined func() # 报错:NameError: name 'func' is not defined 

9. IndentationError

  • 触发原因:Python 代码缩进格式错误(强缩进语言,空格 / 制表符不可混用)
  • 子异常:TabError(专指空格和 Tab 混合缩进)
  • 示例代码

python

运行

if 1>0: print("test") # 报错:IndentationError: expected an indented block 

10. SyntaxError

  • 触发原因:代码不符合 Python 语法规则(属于语法错误,非运行时异常)
  • 示例代码

python

运行

if 1>0 # 报错:SyntaxError: invalid syntax(少写冒号) print("hello) # 报错:SyntaxError: EOL while scanning string literal(引号不闭合) 

11. UnicodeDecodeError

  • 触发原因:读取文件时,使用的编码格式与文件实际编码不一致(中文场景高频踩坑)
  • 示例代码

python

运行

# GBK编码的文件用UTF-8读取触发异常 open("中文文件.txt", "r", encoding="utf-8").read() # 报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 0: invalid start byte 

12. OverflowError

  • 触发原因:数值运算结果超出 Python 可表示的最大范围(Python3 int 无上限,浮点数 / 特定运算会触发)
  • 示例代码

python

运行

import math math.exp(1000) # 报错:OverflowError: math range error(指数运算溢出) 

三、常用内置异常(28 个,项目开发高频)

3.1 算术 / 数值相关异常

13. FloatingPointError
  • 触发原因:浮点运算中出现无法计算的数学错误(Python3 极少触发,C 扩展中多见)
  • 示例代码

python

运行

# Python3中几乎不触发,仅作了解 0.0 / 0.0 # 返回 nan,特殊浮点场景触发该异常 
14. DecimalException
  • 触发原因:使用 decimal 高精度小数模块时出现数值运算错误(如除以 0、无效精度)
  • 示例代码

python

运行

from decimal import Decimal Decimal('10') / Decimal('0') # 报错:DecimalException: Division by zero 

3.2 序列 / 集合 / 映射相关异常

15. StopIteration
  • 触发原因:迭代器遍历到末尾后,继续调用 next() 函数(for 循环会自动捕获)
  • 示例代码

python

运行

lst_iter = iter([1,2,3]) next(lst_iter) # 1 next(lst_iter) # 2 next(lst_iter) # 3 next(lst_iter) # 报错:StopIteration 
16. BufferError
  • 触发原因:缓冲区操作出错(如写入已关闭的缓冲区、缓冲区大小不匹配)
  • 示例代码

python

运行

# 二进制缓冲区溢出场景触发 buf = bytearray(5) buf += b"123456" # 无报错,底层溢出时触发BufferError 
17. LookupError
  • 触发原因:序列 / 映射查找类异常的父类(IndexError、KeyError 均为其子类,极少直接捕获)
18. AssertionError
  • 触发原因assert 断言语句条件判断为 False(用于调试,校验条件)
  • 示例代码

python

运行

num = 5 assert num > 10, "num必须大于10" # 报错:AssertionError: num必须大于10 

3.3 文件 / IO 操作相关异常

19. PermissionError
  • 触发原因:对文件 / 文件夹执行操作时无对应系统权限(读无权限文件、写只读文件等)
  • 示例代码

python

运行

open("C:/Windows/System32/只读文件.txt", "w") # 报错:PermissionError: [Errno 13] Permission denied: 'xxx' 
20. IsADirectoryError
  • 触发原因:将文件夹当作文件操作(如用 open() 打开文件夹)
  • 示例代码

python

运行

open("C:/Users/我的文件夹", "r") # 报错:IsADirectoryError: [Errno 21] Is a directory: 'xxx' 
21. NotADirectoryError
  • 触发原因:将文件当作文件夹操作(如对文件执行遍历 / 创建子目录)
  • 示例代码

python

运行

import os os.listdir("C:/Users/文件.txt") # 报错:NotADirectoryError: [Errno 20] Not a directory: 'xxx' 
22. OSError
  • 触发原因:系统级 IO 错误父类(FileNotFoundError/PermissionError 等均为其子类)
  • 示例代码

python

运行

open("Z:/不存在的磁盘/file.txt") # 报错:OSError: [Errno 2] No such file or directory: 'xxx' 
23. EOFError
  • 触发原因:输入函数(input ()/sys.stdin)读取数据时遇到文件末尾(EOF)
  • 示例代码

python

运行

input() # 控制台按 Ctrl+D → 报错:EOFError: EOF when reading a line 

3.4 函数 / 类 / 模块相关异常

24. ImportError
  • 触发原因:导入模块失败(模块不存在、路径错误、拼写错误)
  • 示例代码

python

运行

import python_test_12345 # 报错:ImportError: No module named 'python_test_12345' 
25. ModuleNotFoundError
  • 触发原因:ImportError 子类,专指导入的模块不存在(Python3.6 + 新增)
  • 示例代码

python

运行

import xxx_module # 报错:ModuleNotFoundError: No module named 'xxx_module' 
26. RecursionError
  • 触发原因:函数递归调用层数超出 Python 默认递归深度(≈1000 层)
  • 示例代码

python

运行

def func(): func() func() # 报错:RecursionError: maximum recursion depth exceeded 
27. TypeError(传参相关补充)
  • 触发原因:函数调用时参数数量 / 类型不匹配
  • 示例代码
def add(a, b): return a + b add(1) # 报错:TypeError: add() missing 1 required positional argument: 'b' add(1,2,3) # 报错:TypeError: add() takes 2 positional arguments but 3 were given 
28. UnboundLocalError
  • 触发原因:函数内部先使用局部变量,后对其赋值(Python 判定变量未绑定)
  • 示例代码
def func(): print(num) # 先使用 num = 10 # 后赋值 func() # 报错:UnboundLocalError: local variable 'num' referenced before assignment 
29. RuntimeError
  • 触发原因:运行时通用错误,不属于其他具体异常类型(递归未终止、线程死锁等)
  • 示例代码

python

运行

import sys sys.setrecursionlimit(5) def f():f() f() # 报错:RuntimeError: maximum recursion depth exceeded while calling a Python object 
30. MemoryError
  • 触发原因:程序占用内存超出系统可用内存(创建超大列表、读取超大文件等)
  • 示例代码

python

运行

lst = [1] * 10**10 # 报错:MemoryError(创建100亿元素列表,内存不足) 

3.5 其他常用异常

31. UnicodeEncodeError
  • 触发原因:字符串写入 / 输出时,编码格式不支持目标字符(如 ASCII 编码写入中文)
  • 示例代码

python

运行

with open("test.txt", "w", encoding="ascii") as f: f.write("你好Python") # 报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 
32. UnicodeTranslateError
  • 触发原因:字符编码转换时出错(存在无法转换的字符)
33. ConnectionError
  • 触发原因:网络连接相关错误父类,核心子类:
    • ConnectionRefusedError:连接被拒绝(服务端未启动 / 端口错误)
    • ConnectionAbortedError:连接被中止(服务端主动断开)
    • ConnectionResetError:连接被重置(网络中断 / 服务端重启)
  • 示例代码

python

运行

import socket s = socket.socket() s.connect(("127.0.0.1", 9999)) # 端口无服务 → 报错:ConnectionRefusedError: [Errno 111] Connection refused 
34. TimeoutError
  • 触发原因:网络请求 / 文件操作超时(连接服务器、读取网络数据超时等)
  • 示例代码

python

运行

import socket s = socket.socket() s.settimeout(1) s.connect(("www.xxx.com", 80)) # 超时 → 报错:TimeoutError: timed out 
35. ReferenceError
  • 触发原因:访问已被垃圾回收销毁的对象弱引用(极少手动触发,框架底层多见)
36. SystemError
  • 触发原因:Python 解释器内部出错(代码语法正确,环境损坏等,极少遇到)
37. TabError
  • 触发原因:代码混用 Tab 制表符和空格缩进(Python3 强制缩进统一)
  • 示例代码

python

运行

def func(): print(1) # 空格缩进 print(2) # Tab缩进 → 报错:TabError: inconsistent use of tabs and spaces in indentation 
38. ValueError(其他场景补充)
  • 触发原因:内置函数传入无效参数(如 range () 传负数步长)
  • 示例代码

python

运行

range(10, 0, -0) # 报错:ValueError: zero step for range() 

四、少见 / 进阶内置异常(22 个,了解即可)

异常名核心触发原因
ArithmeticError所有算术异常的父类(ZeroDivisionError/OverflowError 子类)
BytesWarning字节串 / 字节数组操作的警告类异常
DeprecationWarning使用 Python 已废弃的语法 / 函数的警告
EnvironmentError环境相关错误的父类(OSError 子类)
FutureWarningPython 未来版本会废弃的语法 / 函数的警告
GeneratorExit生成器被关闭时触发的异常
IOErrorPython2 的 IO 异常,Python3 合并到 OSError
KeyboardInterruptCtrl+C 终止程序,系统级异常(不建议捕获)
MemoryError内存溢出(前文已归类为常用)
PendingDeprecationWarning即将被废弃的语法 / 函数警告
ResourceWarning资源未正确释放的警告(如文件未 close)
RuntimeWarning运行时潜在风险警告(如无效浮点运算)
SyntaxWarning语法潜在风险警告(如歧义缩进)
SystemExitsys.exit () 触发程序退出,系统级异常(不建议捕获)
UnicodeWarning字符编码相关的警告
UserWarning自定义警告的基类
VMSError虚拟机相关错误(极少遇到)
WindowsErrorWindows 系统专属 IO 错误,Python3 合并到 OSError
BlockingIOError非阻塞 IO 操作时资源被阻塞触发
ChildProcessError子进程操作失败触发(如 subprocess 调用出错)
ConnectionAbortedError连接被中止(ConnectionError 子类)
ConnectionResetError连接被重置(ConnectionError 子类)

总结

  1. 异常体系核心:BaseException 是根类,Exception 是所有可捕获业务异常的父类,系统级异常不建议捕获;
  2. 优先级记忆:高频必用异常(12 个)> 常用内置异常(28 个)> 少见 / 进阶异常(22 个),优先掌握高频异常即可覆盖 90% 开发场景;
  3. 核心区分:SyntaxError 是语法错误(运行前检测),其他异常均为运行时错误,try-except 仅能捕获运行时异常。

Read more

【Linux系统编程】(三十五)揭秘 Linux 信号产生:从终端到内核全解析

【Linux系统编程】(三十五)揭秘 Linux 信号产生:从终端到内核全解析

前言         在 Linux 系统中,信号是进程间异步通信的 “信使”,而 “信号产生” 则是这个通信过程的起点。无论是我们熟悉的Ctrl+C终止进程,还是程序运行中出现的段错误、定时器超时,本质上都是信号被触发产生的过程。很多开发者只知道 “信号能终止进程”,却不清楚信号到底是怎么来的 —— 是用户操作触发的?还是系统自动产生的?不同场景下信号的产生机制有何不同?         本文将基于 Linux 内核原理,结合 5 种核心信号产生场景(终端按键、系统命令、函数调用、软件条件、硬件异常),用通俗的语言,带你全方位揭秘信号产生的底层逻辑,让你不仅 “知其然”,更 “知其所以然”。下面就让我们正式开始吧! 一、信号产生的核心本质:谁在 “发送” 信号?         在深入具体场景之前,我们先明确一个核心问题:信号是由谁产生并发送的?答案是操作系统(OS)。         无论信号的触发源头是用户按键、函数调用还是硬件异常,

By Ne0inhk
Flutter 三方库 dloader 的鸿蒙化适配指南 - 掌握极简且高性能的文件离线技术、助力鸿蒙应用构建稳健的后台下载与资源调度系统

Flutter 三方库 dloader 的鸿蒙化适配指南 - 掌握极简且高性能的文件离线技术、助力鸿蒙应用构建稳健的后台下载与资源调度系统

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 dloader 的鸿蒙化适配指南 - 掌握极简且高性能的文件离线技术、助力鸿蒙应用构建稳健的后台下载与资源调度系统 前言 在 OpenHarmony 鸿蒙应用向大容量、多资源协同(如:大型游戏素材更新、离线地图包下载、企业级加密文档分发)进化的过程中,单纯的 HttpClient 请求已无法满足用户对“进度可见性”、“后台持续性”以及“异常自愈”的渴望。dloader 作为一个专为 Dart 设计的流式下载组件,旨在通过一套极为精简的 DSL(领域特定语言),将复杂的多线程分片、百分比计算及缓存校验逻辑封装在黑盒之中。本文将探讨如何在鸿蒙端利用 dloader 打造“丝滑且可信”的资源获取体验。 一、原原理分析 / 概念介绍 1.1 基础原理

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 dart_appwrite 将鸿蒙应用极速接入强大的开源后端即服务(BaaS 最佳实践)

Flutter for OpenHarmony: Flutter 三方库 dart_appwrite 将鸿蒙应用极速接入强大的开源后端即服务(BaaS 最佳实践)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 应用开发时,后端基础设施往往是中小型开发者或初创团队的拦路虎。购买服务器、部署数据库、集成 OAuth 登录、管理文件云存储……这一系列工作不仅耗时,还容易在安全性上出现漏洞。 dart_appwrite 是连接 OpenHarmony 应用与 Appwrite(类似于 Firebase 的开源替代品)的官方桥梁。它为鸿蒙开发者提供了全套的后端 API,让你在短短几分钟内就能为鸿蒙应用增加账号系统、实时数据库和云存储功能,彻底实现“一人完成全栈开发”。 一、鸿蒙-Appwrite 云端架构图 该库作为桥梁,将鸿蒙设备的请求安全分发到后端各个功能模块。 鸿蒙 App (Dart SDK) Appwrite Client Account (身份验证) Databases (文档型数据库) Storage

By Ne0inhk
使用LLaMA-Factory的数据集制作流程与训练微调Qwen3及评估

使用LLaMA-Factory的数据集制作流程与训练微调Qwen3及评估

文章目录 * 1 LLaMA-Factory环境安装 * 2 数据集制作 * 3 模型下载 * 4 使用命令进行训练 而非webui * 训练命令 * 导出模型命令 * 5 训练后的Qwen3模型评估 * 6 训练后的Qwen3模型进行测试 AutoDL中的LLaMA-Factory 使用 训练微调 llame3数据集 cmmlu 使用LLaMA-Factory微调训练Qwen2-VL-7B/Qwen2.5-VL-7B与视觉大模型数据集制作流程与训练评估 b站:https://www.bilibili.com/video/BV1KceNzoE87/ 本文介绍了使用LLaMA-Factory框架微调Qwen3-4B-Instruct-2507模型的完整流程。内容包括:1) 环境安装与WebUI配置;2) 数据集制作与格式要求;3) 通过ModelScope下载Qwen3模型;4) 使用命令行进行LoRA微调训练,展示了训练参数与GPU使用情况;5) 模型导出方法;6) 最后对微调后的模型进行评估。整个过程在6块GPU上约15分钟完成训练,并提供了训练

By Ne0inhk