有不少刚接触写代码的新手, 会碰到一个令人头疼不已的状况, 那就是代码在平常运行的时候, 表现得毫无问题, 可一旦输入异样的内容, 抑或是读取错误的数据, 程序便会立刻出现报错的情况, 进而直接闪退并终止运行。
前十一讲, 我们学了变量, 学了循环, 学了条件判断, 学了函数, 也学了列表字典等基础语法, 这些代码, 要是在完全理想的正确输入之下, 是能够正常运行的, 然而, 在真实使用场景当中, 错误到处都有。
在此节课当中, 我们将会去学习核心必备的知识点, 也就是异常处理。一旦学会了它,那么你的程序就能够拥有“容错能力”, 在出现错误的时候不会直接就发生崩溃, 进而还能够主动地去提示问题, 其属于是进阶开发以及项目实战所必备的技能啊。
一、什么是异常?
1. 通俗理解
异常就是程序运行过程中出现的非语法错误。
代码写错了会导致语法错误, 像是少写冒号, 或者括号不匹配,如此一来, 程序根本就没法运行标点符号。
虽代码语法不存在问题, 然而运行期间, 数据以及操作不符合既定规则, 进而致使程序被强制终止, 于此种状况下便产生称作异常的情况。
2. 常见新手高频异常案例
我们写一段看似没问题的代码:
# 数字输入、除法计算
num = int(input("请输入一个数字:"))
= 10 / num
print("计算结果:", )
- 正常情况:输入2,代码正常输出结果;
出现了异常1, 也就是值错误, 当输入字母abc时, 会触发这种情况, 即无法将字符串转为数字。
- 异常2, 也就是除零错误, 当输入为0时, 便会触发, 因为在数学领域当中是不可以除以0的。
程序一旦触发异常之事, 便会即刻停止下来, 后续代码全然不会执行, 此乃我们所需着重破解的核心关键问题所在。
二、核心语法:try- 异常捕获
专门提供了try-语句,用来捕获并处理异常,核心逻辑:
采取让有可能出现错误状况的代码去进行执行的举措, 要是出现了错误, 那就去执行备用的代码, 从而让程序能够持续不断地运行而不会出现崩溃的情况。
1. 基础语法结构
try:
# 可能会出错的、风险代码
代码块
:
# 出现异常后,执行的补救代码
异常处理代码块
2. 实战改造上面的除法案例
try:
num = int(input("请输入一个数字:"))
= 10 / num
print("计算结果:", )
:
print("输入错误!请输入合法的非0数字")
运行效果
1. 输入字母、0、特殊符号,不会闪退,只会友好提示错误;
2. 输入正常数字,正常执行计算逻辑。
这就是异常处理的核心价值:容错、保稳定、优化用户体验。
三、精准捕获:指定异常类型
放置于上方的万能方式能够将形形色色的所有错误予以捕获, 然而却不具备区分具体问题的能力。在实际的实战开发情形当中, 对于我们而言, 需要精确地识别出错误产生的原因, 进而针对具体情况进行处理。
1. 常见内置异常类型
异常名称 触发场景
数值转换错误(字符串转数字失败)
除零运算错误
列表、字符串索引越界
字典不存在指定键
文件不存在
2. 多异常精准捕获语法
try:
num = int(input("请输入一个数字:"))
= 10 / num
print("计算结果:", )
:
print("类型错误:你输入的不是纯数字!")
:
print("数学错误:不能输入0作为除数!")
具有这样的优势, 那就是, 用户能够清楚明晰地晓得自身错在何处, 进而便于修正输入, 而且相较于万能提示更为专业。
四、进阶关键字:else、
先支持两个拓展关键字, 再覆盖正常执行的场景, 接着覆盖无论对错都执行的场景, 最终完整覆盖业务逻辑。
1. else:无异常时执行
代码无报错、正常运行完毕,执行else中的代码:
try:
num = int(input("请输入一个数字:"))
= 10 / num
:
print("输入格式错误!")
:
print("禁止除以0!")
else:
# 只有try代码完全成功,才会执行
print("计算成功!最终结果:", )
2. :无论是否异常,必执行
常用于关闭文件、释放资源、结束提示等固定操作:
try:
num = int(input("请输入一个数字:"))
= 10 / num
print("计算结果:", )
:
print("程序运行出错!")
:
打印, “=== 本次运算结束, 等待下次输入 ===”。
核心特点是, 无论代码会不会报错, 代码都会百分百执行, 它是项目资源释放的核心语法。
五、主动抛出异常:raise
除开捕获那由系统自动触发起来的异常之外, 我们还能够手动去自定义异常, 主动地终止那些不合理的操作, 以此来规范数据。
语法:
raise 异常类型("自定义错误提示")
实战案例:限制年龄输入
age = int(input("请输入你的年龄:"))
if< 0 or age > 150:
# 主动抛出数值异常
raise ("年龄输入不合法!必须在0-150之间")
else:
print("年龄输入正常")
其适用的场景包含数据校验, 其适用的场景包含权限判断, 其适用的场景包含参数过滤, 这是企业级代码的标准化写法。
六、课堂综合实战:完整容错计算器
从本节课的全部知识点里进行整合, 去编写一款简易的除法计算器在运行时永远不会崩溃, 专门涵盖精准报错、于正常情况之下的提示以及收尾时固定会出现的语句。
# 容错计算器
def ():
try:
创建变量num1, 使其等于将输入的内容, 也就是请输入第一个数字,转换至整型数据形式。
将输入“请输入第二个数字: ”所得到的内容, 进行类型转换为整数类型并赋予num2。
res = num1 / num2
:
print("错误提示:请输入纯整数数字!")
:
print("错误提示:除数不能为0!")
else:
打印, 格式化输出内容是, 计算完成, 冒号后面是, 数字一, 除号, 数字二, 等于, 结果保留两位小数。, 两个f, 右括号, 标点符号。
:
print("—————— 运算流程结束 ——————")
# 调用函数
()
七、本节课核心总结
1. 会致使程序闪退的异常, 属于运行时错误, 是开发过程当中必须要去解决的问题。
2. try- 核心:捕获异常,防止程序崩溃,实现容错;
3. 支持精准捕获指定异常,替代万能捕获,让报错更清晰;
4. else 无错执行、 必执行,完善代码逻辑闭环;
5. raise 可主动抛出异常,用于数据校验和规则限制。
课后作业
1. 写下代码, 于其中输入列表索引, 借由异常处理这等方式, 去解决索引越界时出现的报错问题。
2. 扩展练习内容为, 联合字典, 捕捉键不存在的异常状况, 给出友善的提示信息。