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

【Python】PyInstaller打包exe逆向实战:从pyinstxtractor到源码还原

1. PyInstaller打包exe逆向原理剖析 当你用PyInstaller把Python脚本打包成exe时,它实际上做了三件事:首先将Python代码编译成.pyc字节码,然后把这些字节码和Python解释器一起打包,最后加上一个自解压的启动器。这个过程中最关键的步骤是字节码生成和资源打包,而我们要逆向的就是这个过程。 PyInstaller生成的exe文件结构很有特点,它本质上是个自解压压缩包。用二进制编辑器打开这类exe,你会在文件末尾看到明显的"MEI"魔数标记,这就是PyInstaller的签名。解包时,pyinstxtractor工具正是通过定位这个标记来找到打包数据的起始位置。 逆向过程中最麻烦的是PyInstaller会对.pyc文件做手脚。正常的Python字节码文件包含16字节头部(4字节魔数+4字节时间戳+4字节文件大小+4字节校验和),但PyInstaller打包时会故意去掉前8个字节。这就是为什么直接反编译提取出的文件会报"Invalid pyc magic number"错误。 2. 工具准备与环境搭建 工欲善其事必先利其器,我们需要准备以下

By Ne0inhk
一文吃透 TF-IDF:从核心原理到 Python 实战,解锁 NLP 关键词提取核心技能

一文吃透 TF-IDF:从核心原理到 Python 实战,解锁 NLP 关键词提取核心技能

目录 一、先搞懂:关键词提取任务到底在做什么? 二、TF-IDF 核心原理:一文讲透 TF、IDF 与加权逻辑 2.1 TF:词频 2.2 IDF:逆文档频率 2.3 TF-IDF:最终加权计算 三、Python 实战:基于 sklearn 实现 TF-IDF 计算与关键词提取 3.1 语料数据准备 3.2 完整代码实现 3.3 运行结果与核心解读 3.4 中文文本的 TF-IDF 拓展 四、TF-IDF 的优缺点与核心应用场景 4.1

By Ne0inhk
Python操作国产金仓数据库(KingbaseES)全流程:从环境搭建到实战应用

Python操作国产金仓数据库(KingbaseES)全流程:从环境搭建到实战应用

Python操作国产金仓数据库(KingbaseES)全流程:从环境搭建到实战应用 Python操作国产金仓数据库(KingbaseES)全流程:从环境搭建到实战应用,大家好,我是 xcLeigh。现在国产化数据库越来越普及,金仓数据库(KingbaseES)作为一款超实用的企业级关系型数据库,在政府、金融、能源这些关键领域用得特别多。今天我就带大家从零开始,一步步学会用Python操作金仓数据库,从环境准备、连接数据库,到CRUD核心操作、事务处理,再到常见问题排查,内容全是干货,代码拿过去就能用,就算是新手也能很快上手! 前言     中电科金仓(北京)科技股份有限公司(以下简称“电科金仓”)成立于1999年,是成立最早的拥有自主知识产权的国产数据库企业,也是中国电子科技集团(CETC)成员企业。电科金仓以“提供卓越的数据库产品助力企业级应用高质量发展”为使命,致力于“成为世界卓越的数据库产品与服务提供商”。     电科金仓自成立起始终坚持自主创新,专注数据库领域二十余载,具备出色的数据库产品研发及服务能力,核心产品金仓数据库管理系统KingbaseES(简称“KES”

By Ne0inhk
ksycopg2实战:Python连接KingbaseES数据库的完整指南

ksycopg2实战:Python连接KingbaseES数据库的完整指南

摘要:本文详细介绍了KingbaseES数据库的Python专用驱动ksycopg2的使用方法。内容涵盖驱动安装、连接配置、CRUD操作等基础功能,以及事务管理、连接池等高级特性。ksycopg2作为遵循Python DBAPI 2.0规范的线程安全适配器,针对KingbaseES进行了深度优化,支持数据类型映射、批量操作等特性。文章提供了完整的业务表创建示例和员工管理系统实战案例,包含环境配置、性能优化建议和常见问题解决方案,帮助开发者快速掌握该驱动的使用技巧。通过详细的代码示例,展示了如何高效安全地操作KingbaseES数据库。 一、安装ksycopg2:KingbaseES的Python ksycopg2是 专为KingbaseES数据库设计的Python适配器 ,完全遵循Python DB API 2.0规范,具有线程安全的特性。它不仅提供了高效的数据操作能力,还支持KingbaseES特有的功能特性。 与通用的PostgreSQL驱动psycopg2相比,ksycopg2针对KingbaseES进行了深度优化,特别是在数据类型映射、事务处理和高级功能支持方面表现更加

By Ne0inhk