标签:#Python零基础 #异常处理 #程序调试 #编程避坑
前言
平时运行Python代码,只要遇到报错:文件不存在、数组越界、类型错误、接口请求失败,程序就会直接闪退、终止运行。
在实际项目、爬虫、自动化脚本、数据分析场景中,程序绝对不能因为单次报错直接终止。
这就需要用到 异常处理机制,主动捕获错误、跳过故障代码、输出提示信息,让程序稳定持续运行。本篇零基础保姆教程,全覆盖日常开发99%异常场景,代码直接复制即用。
一、什么是异常?为什么要捕获异常?
异常:代码逻辑本身没问题,但运行时遇到意外情况导致程序报错、终止。
常见场景:
✅ 读取文件时,文件不存在
✅ 字符串转数字格式不合法
✅ 列表取值超出索引范围
✅ 网络请求超时、接口返回异常数据
✅ 字典读取不存在的Key
异常处理的核心作用:捕获错误、记录日志、跳过错误逻辑,保证程序不崩溃。
二、异常处理核心语法:try-except(必学)
基础结构
try:包裹可能报错的风险代码
except:捕获异常,报错后执行的备用逻辑
else:无异常时执行(可选)
finally:无论是否报错,都会执行(可选)
基础demo(零基础入门)
try:# 风险代码:可能报错num = int("abc")except:# 报错后执行print("代码出现异常,格式错误!")print("程序继续运行,不会崩溃")
💡 效果:即使代码报错,也不会终止程序,后续代码正常执行。
三、精准捕获异常(生产环境标准写法)
新手不建议直接空except,无法区分错误类型,生产环境推荐精准捕获指定异常。
1、常见内置异常类型
ValueError:数值格式错误(字符串转数字失败)
FileNotFoundError:文件不存在
IndexError:列表索引越界
KeyError:字典Key不存在
TypeError:数据类型不匹配
Exception:万能异常,捕获所有常规异常
2、精准捕获示例
try:text = "python"num = int(text)except ValueError:print("数值转换异常:非数字字符串无法转换")
3、获取异常详细信息
try:1 / 0except Exception as e:print("异常详情:", e)
四、else & finally 关键字实战用法
1、else:无异常才执行
适合:代码正常执行成功后的收尾提示、数据保存操作
try:num = int("123")except Exception as e:print("出错了:", e)else:print("代码执行成功,数值为:", num)
2、finally:无论对错必执行
适合:关闭文件、释放资源、结束链接、程序收尾
try:f = open("test.txt", "r", encoding="utf-8")content = f.read()except Exception as e:print("读取文件异常:", e)finally:f.close()print("文件已强制关闭")
💡 拓展:日常文件读写更推荐with语句,自动关闭,无需finally手动释放资源。
五、高频实战场景(直接复制生产可用)
场景1:文件读取容错(解决文件不存在报错)
try:with open("test.txt", "r", encoding="utf-8") as f:content = f.read()print("文件读取成功")except FileNotFoundError:print("警告:文件不存在,跳过本次读取")
场景2:字典取值容错(避免KeyError崩溃)
data = {"name": "Python教程", "age": 1}try:print(data["skill"])except KeyError:print("当前字典无该字段,返回默认值")
场景3:列表索引容错(遍历数据防越界)
lst = [10, 20, 30]try:print(lst[10])except IndexError:print("索引超出列表范围")
场景4:爬虫/循环批量任务容错(最常用)
批量爬取、批量处理数据时,单个数据报错,不影响整体循环
url_list = ["url1", "url2", "url3"]for url in url_list:try:# 模拟请求逻辑print(f"正常抓取:{url}")except Exception as e:print(f"{url} 抓取失败,错误:{e},自动跳过")
六、主动抛出异常:raise 关键字
业务开发中,可主动判定条件、主动抛出异常,规范数据校验。
用法场景:参数校验、权限判断、数据合规检测
age = -5if age < 0:raise ValueError("年龄不能为负数,请输入合法数值")
💡 说明:raise 会主动终止程序,配合try-except可实现自定义容错逻辑。
七、进阶:自定义异常(项目开发必备)
内置异常无法满足复杂业务时,可以自定义异常类型,精准区分业务错误。
# 自定义异常类class ParamsError(Exception):"""参数校验异常"""pass# 业务逻辑使用def check_score(score):if score < 0 or score > 100:raise ParamsError("分数必须在0-100之间")print("分数校验通过")try:check_score(120)except ParamsError as e:print("业务参数异常:", e)
八、新手高频踩坑总结
1、滥用万能空except
直接写 except: 会捕获所有错误,隐藏代码bug,开发阶段建议精准捕获异常,方便排错。
2、try包裹过多代码
只把可能报错的风险代码放入try内部,正常逻辑不要嵌套,方便定位问题。
3、只捕获异常不处理异常
不要空捕获不打印、不记录日志,报错后无任何提示,后期无法排查问题根源。
4、混淆finally执行逻辑
finally无论对错必执行,资源释放、链接关闭放这里,业务逻辑不要写在finally。
文末结语
异常处理是Python项目从“玩具代码”变成“工程级稳定代码”的关键技能。
熟练掌握 try-except、精准捕获、自定义异常,能彻底解决程序闪退、批量任务中断、未知报错崩溃问题,让你的代码稳定性提升一个档次。
本文所有案例适配生产场景,可直接复制复用,建议收藏,写脚本、爬虫、业务代码随时查阅!