本章摘要核心目标掌握 try-except 异常处理机制让程序遇到错误不崩溃、继续运行核心知识点try-except 基本结构、捕获多种异常、as 获取异常信息、else 子句、finally 子句、常见异常类型实操产出安全除法计算器处理除零、非数字输入等异常并允许重试前置基础第12章文件读写、第5章 while 循环、第3章 if 条件判断一、写在前面上一章你学会了文件读写能用 Python 读取配置、保存数据了。但你一定遇到过这种情况程序打开一个不存在的文件或者读到一半编码出问题——然后整个程序直接崩掉屏幕上刷出一大堆红色报错信息。这种程序运行中途出错就崩溃的行为在 Python 里叫异常Exception。异常不是Bug而是程序运行时遇到的意外情况用户输入了字母但你期望数字、除数是零、文件路径写错了……这些都会触发异常。本章教你用try-except语句捕获异常——程序遇到错误时不再崩溃而是优雅地处理它、提示用户、继续运行。这是写出健壮程序的关键技能。二、什么是异常先看一个最常见的异常——除以零# 除以零会直接崩溃result10/0print(计算完成)运行结果ZeroDivisionError: division by zero程序在10 / 0这一行就崩了后面的print(计算完成)根本没机会执行。这就是异常的威力一旦触发程序立即停止。再看一个——把字符串当数字用# 取消注释运行会触发 ValueError# age int(十八岁)# print(age)Python 会报ValueError: invalid literal for int() with base 10: 十八岁意思是你想把十八岁这个字符串转成整数Python 转不了。异常的本质Python 遇到无法处理的操作时抛出一个异常对象。如果不处理它程序就崩溃。处理了它程序就能继续跑。三、try-except 基本结构try-except的用法很简单把可能出错的代码放进try块出错后的处理逻辑放进except块。基本语法try:# 可能出错的代码result10/0except:# 出错后执行这里print(出错了但程序不会崩溃)print(程序继续运行)运行结果出错了但程序不会崩溃 程序继续运行try块中的代码如果正常执行except块就被跳过如果try块中出错了程序不崩溃跳到except块执行处理逻辑。四、捕获特定异常直接写except:会捕获所有异常但这不是好习惯——可能把不该忽略的错误也吞掉了。更好的做法是指定异常类型只捕获你预期会发生的错误。4.1 捕获指定异常try:result10/0exceptZeroDivisionError:print(除数不能为零)运行结果除数不能为零只有ZeroDivisionError会被捕获其他类型的异常仍然会让程序崩溃。4.2 捕获多种异常一段代码可能触发不同类型的异常你可以同时指定多个异常类型try:numint(input(请输入一个数字))result100/numprint(f结果是{result})exceptValueError:print(输入的不是有效数字)exceptZeroDivisionError:print(除数不能为零)运行效果请输入一个数字abc 输入的不是有效数字 请输入一个数字0 除数不能为零 请输入一个数字4 结果是25.0用户输入字母时触发ValueError输入 0 时触发ZeroDivisionError每种异常都有对应的提示程序不会崩溃。4.3 一个 except 捕获多种异常如果多种异常的处理逻辑相同可以用元组合并try:numint(input(请输入一个数字))result100/numexcept(ValueError,ZeroDivisionError):print(输入有误请重新输入有效数字)五、as 获取异常信息有时候你不仅想告诉用户出错了还想把具体的错误信息显示出来。用as关键字可以把异常对象赋值给一个变量try:numint(十八岁)exceptValueErrorase:print(f转换失败错误信息{e})运行结果转换失败错误信息invalid literal for int() with base 10: 十八岁e就是异常对象直接打印它会输出 Python 的原始错误描述。这在调试程序时非常有用——既处理了异常又保留了错误细节。习惯写法异常变量通常用e或err表示 error错误。六、else 子句else子句放在所有except后面只有 try 块没有发生任何异常时才会执行。try:numint(input(请输入年龄))exceptValueError:print(请输入数字)else:# try 块没出错才会执行这里print(f你的年龄是{num}岁)ifnum18:print(已成年)else:print(未成年)运行效果请输入年龄20 你的年龄是 20 岁 已成年 请输入年龄abc 请输入数字else的价值把成功后的逻辑和可能出错的代码分开结构更清晰。如果都塞进try块里try 块中后续代码的异常也会被捕获可能掩盖真正的问题。七、finally 子句finally子句放在最后无论是否发生异常都会执行。它通常用于清理工作比如关闭文件、释放资源。try:fopen(data.txt,r,encodingutf-8)contentf.read()print(content)exceptFileNotFoundError:print(文件不存在)finally:# 不管有没有出错都要关闭文件print(执行清理工作)运行效果文件存在时文件内容 执行清理工作运行效果文件不存在时文件不存在 执行清理工作finally最经典的场景就是文件操作不管读取成功还是失败文件都应该被关闭。后面学到数据库操作、网络请求时finally也是标配。八、try-except-else-finally 完整结构把四个子句组合在一起就是完整的异常处理结构try:# 1. 可能出错的代码numint(input(请输入一个数字))result100/numexceptValueErrorase:# 2. 捕获 ValueErrorprint(f输入错误{e})exceptZeroDivisionErrorase:# 3. 捕获 ZeroDivisionErrorprint(f计算错误{e})else:# 4. 没出错才执行print(f计算结果{result})finally:# 5. 无论如何都执行print(---本次计算结束---)执行顺序总结情况tryexceptelsefinallytry 没出错✅ 执行❌ 跳过✅ 执行✅ 执行try 出错了执行到出错处✅ 匹配的执行❌ 跳过✅ 执行记住一个口诀try 试错、except 兜底、else 成功后做事、finally 收尾必跑。九、常见异常类型速查Python 内置了数十种异常类型新手阶段最常见的有这 6 种异常类型触发场景示例代码ValueError值类型不对如int(abc)int(hello)TypeError类型不支持该操作如数字字符串1 2ZeroDivisionError除以零10 / 0FileNotFoundError打开不存在的文件open(不存在.txt)IndexError列表索引越界[1, 2, 3][10]KeyError字典键不存在{a: 1}[b]每种异常的触发示例# 1. ValueError值无法转换# 取消注释运行会触发 ValueError# int(hello)# 2. TypeError类型不兼容# 取消注释运行会触发 TypeError# result 1 2# 3. ZeroDivisionError除以零# 取消注释运行会触发 ZeroDivisionError# result 10 / 0# 4. FileNotFoundError文件不存在# 取消注释运行会触发 FileNotFoundError# f open(不存在.txt)# 5. IndexError索引越界# 取消注释运行会触发 IndexError# names [小明, 小红]# print(names[10])# 6. KeyError字典键不存在# 取消注释运行会触发 KeyError# d {name: 小明}# print(d[phone])这 6 种异常覆盖了新手阶段 90% 的报错场景。遇到红色报错信息时先看异常类型名就能快速定位问题。十、主动抛出异常除了被动等异常发生你还可以用raise关键字主动抛出异常。当用户的数据不符合业务规则时主动报错比默默返回错误结果更安全defset_age(age):ifage0orage150:raiseValueError(年龄必须在 0-150 之间)print(f年龄设置为{age})# 正常调用set_age(18)# 年龄设置为 18# 触发异常# 取消注释运行会触发 ValueError# set_age(-5)raise抛出的异常和自然触发的异常完全一样也可以用try-except捕获try:set_age(-5)exceptValueErrorase:print(f设置失败{e})运行结果设置失败年龄必须在 0-150 之间raise在写函数时特别有用在函数入口检查参数合法性不合法就抛异常把问题暴露在最早的位置。十一、Scratch 积木对照ScratchPython说明程序报错直接闪退无法处理try-exceptPython 能捕获异常并继续运行Scratch 报错即崩溃# Scratch 报错直接闪退 → Python 用 try-except 捕获继续运行try:numint(input(请输入数字))print(100/num)except(ValueError,ZeroDivisionError)ase:print(f输入有误{e}请重试)在 Scratch 里如果你的积木逻辑出问题比如除以零程序会直接卡住或闪退没有先拦住错误再处理的机制。Python 的try-except让你可以在错误发生时拦截它、处理它程序照常运行。十二、综合实战安全除法计算器综合运用try-except、input输入、int类型转换、while循环、if条件判断写一个除法计算器用户输入两个数字做除法处理除零错误、非数字输入等异常出错后允许重试。# # 安全除法计算器# print(*40)print( 安全除法计算器 v1.0)print(*40)whileTrue:print()print(输入两个数字我来帮你算除法)print(输入 q 退出程序)print(-*30)# 获取第一个数字num1_inputinput(请输入被除数)ifnum1_inputq:print(再见)break# 获取第二个数字num2_inputinput(请输入除数)ifnum2_inputq:print(再见)breaktry:# 尝试转换为浮点数并计算num1float(num1_input)num2float(num2_input)resultnum1/num2exceptValueError:# 输入的不是数字print(⚠️ 输入有误请输入有效的数字不要输入字母或符号)continueexceptZeroDivisionError:# 除数为零print(⚠️ 计算有误除数不能为零)continueelse:# 计算成功输出结果print(f✅{num1}÷{num2}{result})finally:# 每次计算结束都打印分隔线print(-*30)运行效果 安全除法计算器 v1.0 输入两个数字我来帮你算除法 输入 q 退出程序 ------------------------------ 请输入被除数100 请输入除数abc ⚠️ 输入有误请输入有效的数字不要输入字母或符号 ------------------------------ 输入两个数字我来帮你算除法 输入 q 退出程序 ------------------------------ 请输入被除数100 请输入除数0 ⚠️ 计算有误除数不能为零 ------------------------------ 输入两个数字我来帮你算除法 输入 q 退出程序 ------------------------------ 请输入被除数100 请输入除数4 ✅ 100.0 ÷ 4.0 25.0 ------------------------------分步拆解while True循环让计算器持续运行用户可以反复计算直到输入q退出while循环第5章已学两次input获取输入分别读取被除数和除数输入q可以随时退出try块做转换和计算float()把字符串转成浮点数再做除法。这两步是最容易出错的——输入字母会触发ValueError除数为零会触发ZeroDivisionErrorexcept ValueError捕获非数字输入提示用户重新输入用continue跳回循环开头重试except ZeroDivisionError捕获除零错误同样提示并重试else块只有计算成功时才执行输出格式化结果finally块不管成功还是失败都打印分隔线让每次计算的输出之间有清晰的视觉分隔continue关键字出错后不用从头开始循环continue直接跳到下一次循环让用户重新输入这个案例体现了异常处理的核心思想不是消灭错误而是优雅地应对错误。程序不会因为用户输入错误就崩溃而是给出友好提示让用户继续使用。十三、常见报错速查表报错信息出现场景原因解决方法ValueError: invalid literal for int() with base 10: xxxint()转换字符串内容不是纯数字先用isdigit()检查或用try-except捕获TypeError: unsupported operand type(s) for : int and str运算数字和字符串直接相加用str()或int()统一类型ZeroDivisionError: division by zero除法运算除数为 0除法前检查除数是否为 0 或用try-except捕获FileNotFoundError: [Errno 2] No such file or directory: xxxopen()打开文件文件路径不存在先用os.path.exists()检查或用try-except捕获IndexError: list index out of range列表取值索引超出列表长度先用len()检查长度或用try-except捕获KeyError: xxx字典取值键不存在改用dict.get(key)安全取值十五、本章小结本章你掌握了 Python 异常处理的完整体系异常的本质——程序运行时遇到意外情况会抛出异常不处理就崩溃try-except基本结构——try放可能出错的代码except放出错后的处理逻辑捕获特定异常——用异常类型名精确捕获避免吞掉不该忽略的错误as获取异常信息——except ValueError as e把错误对象赋值给变量方便调试else子句——try 没出错才执行把成功逻辑和试错逻辑分离finally子句——无论如何都执行用于关闭文件、释放资源等清理工作常见异常类型——ValueError、TypeError、ZeroDivisionError、FileNotFoundError、IndexError、KeyError覆盖新手阶段绝大多数报错异常处理是程序从能跑到健壮的关键一步。真实项目中所有涉及用户输入、文件操作、网络请求的代码都应该用try-except保护起来。往期回顾《Python 零基础入门从积木到代码》专栏序零基础学 Python 第1章 | 全平台装环境 VS Code 配置 第一个 Hello World零基础学 Python 第2章 | print 输出 变量赋值 input 交互输入零基础学 Python 第3章 | 条件判断if / elif / else零基础学 Python 第 4 章 | for 循环与 range()让程序帮你重复干活零基础学 Python 第 5 章 | while 循环与循环嵌套让程序看着条件自己干活零基础学 Python 第 6 章 | 元组与集合不可变数据与自动去重零基础学 Python 第7章 | 字典 dict键值对存储零基础学 Python 第8章 | 字符串操作与格式化输出零基础学 Python 第9章 | 函数基础def、参数与返回值零基础学 Python 第10章 | 函数进阶参数灵活用法与作用域零基础学 Python 第11章 | 匿名函数与高阶函数零基础学 Python 第12章 | 文件读写让数据持久保存下一章预告到现在为止你写的代码都在一个文件里。当项目变大代码越来越长怎么办下一章学习模块、包与第三方库——把代码拆分成多个文件还能一键安装别人写好的工具库让 Python 的能力指数级扩展。文末资源区资源说明Python 官方文档 - 异常处理https://docs.python.org/3/tutorial/errors.htmlPython 官方文档 - 内置异常类型https://docs.python.org/3/library/exceptions.html本章完整源码chapter13_all.py关注梅雅达编程笔记评论领资料每节课都配套课后练习题与完整源码。代码报错、看不懂知识点可在评论区粘贴问题逐一解答欢迎关注梅雅达编程笔记持续分享Python零基础学习内容