一、前言
之前写的代码一旦遇到错误(比如文件不存在、输入文字转数字、下标越界),程序会直接终止运行。
本篇学习try-except异常捕获机制,主动拦截、处理运行时错误,保证程序不会直接崩溃,同时精准定位报错信息。
二、什么是异常
程序运行过程中出现的错误统称为异常,常见场景:
用户输入文字,强制转整数:
int("abc")→ValueError读取不存在的文件 →
FileNotFoundError列表访问不存在的下标 →
IndexError字典读取不存在的键 →
KeyError数字除以 0 →
ZeroDivisionError
三、基础 try-except 语法
python
运行
try:
# 可能出错的代码放这里
风险代码
except 异常类型:
# 出错后执行的补救代码
错误处理逻辑
基础示例:处理输入转数字报错
python
运行
try:
num = int(input("请输入数字:"))
print(f"你输入的数字是:{num}")
except ValueError:
print("输入错误!你输入的不是合法数字。")
运行测试:
输入
66→ 正常执行打印输入
abc→ 触发 ValueError,执行 except 内提示,程序不会闪退
四、捕获多种不同异常
一段代码可能触发多种错误,可写多个 except 分别处理:
python
运行
try:
arr = [10, 20, 30]
idx = int(input("输入下标取值:"))
print(arr[idx])
res = 10 / idx
print(res)
except ValueError:
print("错误:必须输入数字下标")
except IndexError:
print("错误:下标超出列表范围,列表只有0、1、2")
except ZeroDivisionError:
print("错误:不能除以0")
五、万能捕获:捕获所有异常(Exception)
不确定会出现什么错误时,使用通用异常捕获,可拿到错误详情:
python
运行
try:
f = open("测试文件.txt", "r", encoding="utf-8")
except Exception as err:
print("程序出现异常,错误详情:", err)
开发建议:优先精准捕获指定异常,调试时可用万能捕获查看完整错误信息。
六、else:无异常才执行的代码块
try中代码全部正常、没有报错时,才会进入else分支:
python
运行
try:
age = int(input("输入年龄:"))
except ValueError:
print("输入不是数字")
else:
# 只有转换成功才执行
if age >= 18:
print("成年")
else:
print("未成年")
七、finally:无论是否报错,必定执行
不管代码是否异常,finally里的代码一定会运行,常用于关闭文件、释放资源:
python
运行
f = None
try:
f = open("笔记.txt", "r", encoding="utf-8")
print(f.read())
except Exception as e:
print("读取失败:", e)
finally:
# 文件无论读取成功/失败,最后都关闭
if f is not None:
f.close()
print("文件已关闭")
补充:with open()语法自带自动关闭,日常文件读写优先用 with。
八、主动抛出异常 raise
程序逻辑不满足需求时,可以手动抛出错误,主动终止流程并提示:
python
运行
def check_age(age):
if age < 0:
# 主动抛出数值错误
raise ValueError("年龄不能是负数!")
return age
try:
check_age(-5)
except ValueError as err:
print("校验失败:", err)
九、综合实战:带异常处理的计算器
整合输入、类型转换、除零、异常捕获全套知识点
python
运行
def calc():
try:
n1 = float(input("输入第一个数字:"))
op = input("输入运算符(+ - * /):")
n2 = float(input("输入第二个数字:"))
if op == "+":
print(f"结果:{n1 + n2}")
elif op == "-":
print(f"结果:{n1 - n2}")
elif op == "*":
print(f"结果:{n1 * n2}")
elif op == "/":
print(f"结果:{n1 / n2}")
else:
print("不支持该运算符")
except ValueError:
print("错误:请输入合法数字!")
except ZeroDivisionError:
print("错误:除数不能为0!")
except Exception as e:
print("未知错误:", e)
calc()
十、新手常见问题
捕获异常类型写错,错误无法拦截:核对报错提示的异常名
万能捕获滥用:不推荐直接写 except:,尽量带上 Exception 查看错误信息
finally 逻辑冗余:文件读写优先用 with 自动释放资源
忘记缩进 try/except 内代码,触发语法错误
十一、下期预告
下一篇:Python 模块与库导入:pip 安装第三方包教程,学会使用现成工具库快速开发。