欢迎光临
我们一直在努力

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 子类)
FutureWarning Python 未来版本会废弃的语法 / 函数的警告
GeneratorExit 生成器被关闭时触发的异常
IOError Python2 的 IO 异常,Python3 合并到 OSError
KeyboardInterrupt Ctrl+C 终止程序,系统级异常(不建议捕获)
MemoryError 内存溢出(前文已归类为常用)
PendingDeprecationWarning 即将被废弃的语法 / 函数警告
ResourceWarning 资源未正确释放的警告(如文件未 close)
RuntimeWarning 运行时潜在风险警告(如无效浮点运算)
SyntaxWarning 语法潜在风险警告(如歧义缩进)
SystemExit sys.exit () 触发程序退出,系统级异常(不建议捕获)
UnicodeWarning 字符编码相关的警告
UserWarning 自定义警告的基类
VMSError 虚拟机相关错误(极少遇到)
WindowsError Windows 系统专属 IO 错误,Python3 合并到 OSError
BlockingIOError 非阻塞 IO 操作时资源被阻塞触发
ChildProcessError 子进程操作失败触发(如 subprocess 调用出错)
ConnectionAbortedError 连接被中止(ConnectionError 子类)
ConnectionResetError 连接被重置(ConnectionError 子类)

总结

  • 异常体系核心:BaseException 是根类,Exception 是所有可捕获业务异常的父类,系统级异常不建议捕获;
  • 优先级记忆:高频必用异常(12 个)> 常用内置异常(28 个)> 少见 / 进阶异常(22 个),优先掌握高频异常即可覆盖 90% 开发场景;
  • 核心区分:SyntaxError 是语法错误(运行前检测),其他异常均为运行时错误,try-except 仅能捕获运行时异常。
  • 赞(0)
    未经允许不得转载:171主机测评 » python 异常处理
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址