🎉 今天是我们学习编程的第9天,前8天我们已经掌握了变量、判断、循环、函数等基础核心知识,今天要攻克一个让程序更健壮、更友好的关键知识点——异常处理!
很多时候我们在写代码时,最怕看到满屏红色报错,程序直接闪退。而异常处理就是给程序穿上「防护铠甲」:就算代码出错,程序也不会崩溃,还能给出友好提示。今天我把try-except、多异常捕获、嵌套、finally、自定义异常完完整整的学习一下!
在学习处理方法前,我们先明白:异常就是程序运行时出现的错误(不是代码语法写错,语法错是编译错误,不属于异常)。
举3个最常遇到的异常例子:
5 / 0lst = [1,2] 却取 lst[5]int("我不是数字")如果不做任何处理,程序会直接报错终止,后面的代码都无法运行。而异常处理的作用:捕获错误 → 处理错误 → 程序继续运行。
这是异常处理最核心的语法,也是必须先掌握的!

try:# 【风险代码块】:可能会出错的代码写在这里 可能抛出异常的代码except 异常类型:# 【异常处理块】:如果try里的代码出错,就执行这里 出错后要执行的代码我们直接写代码对比:无异常处理 VS 有异常处理
# 代码功能:计算两个数的除法a = 10b = 0result = a / b # 这里会触发除0异常print("计算结果:", result)print("程序执行完毕!") # 这行代码永远不会执行a = 10b = 0try:# 可能出错的代码 result = a / bprint("计算结果:", result)# 捕获【除0异常】except ZeroDivisionError:# 出错后执行的代码print("❌ 错误:除数不能为0!")# 程序会继续执行这行代码!print("程序执行完毕!")✅ 运行结果:
❌ 错误:除数不能为0!程序执行完毕!重点记:
try 里放可能出错的代码except 后面写要捕获的异常类型程序可能会触发多种不同的异常,我们可以用多个except,分别处理不同的错误!

一段代码可能报多种错,比如:既可能除0,也可能索引越界。
lst = [10, 20] # 列表只有2个元素,索引0、1try:# 风险代码1:访问不存在的索引 num = lst[5]# 风险代码2:除数为0 result = 10 / 0print(result)# 捕获索引异常except IndexError:print("❌ 错误:访问了列表不存在的索引!")# 捕获除0异常except ZeroDivisionError:print("❌ 错误:除数不能为0!")✅ 运行结果:
❌ 错误:访问了列表不存在的索引!重点记:多个except会从上到下匹配,匹配到第一个符合的异常后,就不会再执行其他except。
如果多个异常的处理方式完全一样,不用写多个except,一个except捕获多种异常即可!
except (异常类型1, 异常类型2, 异常类型3): 统一的处理代码try:# 任选一种错误触发# 1. 索引错误 lst = [1] lst[10]# 2. 除0错误# 5 / 0# 一次性捕获两种异常,统一处理except (IndexError, ZeroDivisionError):print("❌ 程序出错啦!请检查代码~")✅ 无论触发哪种异常,都会输出统一提示,代码更简洁!
和if/for嵌套一样,try-except也可以嵌套使用,适合多层风险代码的场景。
简单理解:外层防护大问题,内层防护小问题。
lst = [10, 0] # 列表:第一个数是被除数,第二个是除数try:# 外层try:防护【索引错误】 num1 = lst[0] num2 = lst[1]# 内层try:防护【除0错误】try: result = num1 / num2print("计算结果:", result)except ZeroDivisionError:print("❌ 内层错误:除数不能为0!")except IndexError:print("❌ 外层错误:列表索引不存在!")✅ 运行结果:
❌ 内层错误:除数不能为0!重点记:嵌套的核心是分层防护,哪一层出错,就执行哪一层的except。
这是异常处理中最实用的知识点!无论程序是否出错,finally里的代码100%会执行。

主要用于释放资源:比如关闭文件、关闭数据库连接、关闭网络请求(避免资源浪费)。
try: 可能出错的代码except 异常类型: 处理异常finally:# 无论是否异常,必执行! 释放资源的代码f = Nonetry:# 打开文件 f = open("test.txt", "r", encoding="utf-8") content = f.read()print(content)# 捕获文件不存在异常except FileNotFoundError:print("❌ 错误:文件不存在!")finally:# 无论文件是否打开成功,都关闭文件if f: f.close()print("✅ 文件已关闭,资源释放成功!")✅ 运行结果(文件不存在时):
❌ 错误:文件不存在!✅ 文件已关闭,资源释放成功!重点记:finally = 必须执行的代码,专门用来收尾、释放资源!
Python自带了很多异常(比如ZeroDivisionError),但我们也可以自己定义异常,适配业务需求!
比如:年龄不能为负数、成绩不能超过100,这些业务规则可以用自定义异常实现。
Exception类raise关键字主动抛出异常try-except捕获自定义异常# 1. 定义自定义异常类:继承ExceptionclassAgeError(Exception):# 构造方法:传递错误信息def__init__(self, msg):self.msg = msg# 打印异常时显示的内容def__str__(self):returnf"自定义年龄异常:{self.msg}"# 2. 业务函数:判断年龄defcheck_age(age):if age < 0or age > 150:# 主动抛出自定义异常raise AgeError("年龄必须在0~150之间!")else:print(f"✅ 年龄{age}合法!")# 3. 捕获自定义异常try: check_age(-5) # 传入非法年龄except AgeError as e:print(e)✅ 运行结果:
自定义年龄异常:年龄必须在0~150之间!重点记:自定义异常 = class 异常名(Exception) + raise 抛出 + try-except 捕获,专门处理业务规则错误!
今天我们学完了Python异常处理的所有核心知识点,只需要记住这6句话:
Exception,用raise抛出,适配业务需求编程学习就是循序渐进!💪 多写代码多练习,异常处理会成为你写稳定程序的神器~关注我,一起学习python吧!