CC++ & Algorithm

Python异常处理基础 try-except

中等4
语言版本:C++Python
概述:把可能出错的代码“保护”起来,就算程序遇到错误也不会崩溃,还能告诉你发生了什么。

让你的程序更坚强——Python异常处理全攻略

小朋友,你写程序的时候,有没有遇到过这样的情况:程序运行得好好的,突然弹出一堆红色错误,然后“啪”地一下就退出了?就像你玩游戏正激烈时,突然弹出“程序未响应”窗口,一切中断,真扫兴!在Python里,这些错误叫做异常。比如你让用户输入一个数字,他却输入了“abc”,程序就会“晕倒”,抛出一个ValueError,接着整个程序停止运行。

为了让程序更“坚强”,Python提供了一个叫try-except的结构。你可以把可能出错的代码放进try里,就像给它穿了一件防弹衣。如果出错了,程序不会直接崩溃,而是跳到except里执行你准备好的“救急”代码,然后继续运行。想象一下:你正在做水果沙拉,用到切芒果。如果不小心切到了手指,你会马上停下来贴创可贴,然后再继续切。try-except就是那个急救包。

下面我们来一步步学习如何用好这个“急救包”。


1. 什么是异常?为什么需要异常处理?

异常就是程序运行时发生的意外情况。比如:

  • 用户输入了字母,但代码要求数字(ValueError
  • 用0做除法(ZeroDivisionError
  • 打开一个不存在的文件(FileNotFoundError

如果不处理,程序就会崩溃。用try-except就能优雅地“接住”这些异常,让程序继续跑。比如你参加跑步比赛,绊了一下,你马上爬起来继续跑,而不是躺在地上不动。


2. try-except 基本用法:给代码穿上防弹衣

最简单的写法:把可能出错的代码放在try里,如果任何错误出现,就执行except里的内容。

# 让用户输入一个整数,如果输错了也不崩溃
try:
    num = int(input("请输入一个整数:"))  # 用户输入,尝试转成整数
    print("你输入的是:", num)
except:
    print("出错了!请确保你输入的是整数。")  # 任何错误都走这里
print("程序继续运行。")  # 无论如何都会执行

运行效果:

  • 输入5 → 输出“你输入的是:5”,然后输出“程序继续运行。”
  • 输入abc → 输出“出错了!请确保你输入的是整数。”,然后输出“程序继续运行。” 程序没崩溃!

生活比喻:就像你足球比赛时,守门员没接住球(异常),但教练立刻用替补守门员(except)上去,比赛继续。


3. 捕获特定异常:对症下药

光用except:会接住所有错误,但有时不同错误需要不同处理。比如:感冒吃感冒药,肚子疼吃肠胃药。在Python里,你可以捕获特定类型的异常,比如ValueError只处理输入错误,ZeroDivisionError只处理除以零。

try:
    num = int(input("请输入一个整数:"))  # 用户输入
    result = 10 / num                     # 可能除以0
    print("10除以你输入的数等于:", result)
except ValueError:
    print("输入的不是整数,请重试。")       # 输入abc时触发
except ZeroDivisionError:
    print("不能除以0,请重新输入。")        # 输入0时触发

这样,程序就像一个细心的小管家:用户输入不对时,温柔提醒;用户输入0时,单独警告。

常见错误:记住要把更具体的异常类型写在前面,把通用的Exception写在最后当“兜底”。如果顺序反了,前面的通用异常会“抢”走所有错误。

# 错误顺序示例(不推荐)
try:
    x = int(input("数字:"))
except Exception:          # 先抓所有异常
    print("出错了")
except ValueError:         # 这一段永远不会执行
    print("值错误")

正确做法:先写具体异常,最后写Exception

try:
    x = int(input("数字:"))
except ValueError:
    print("请输入数字")
except Exception as e:     # 用as e可以拿到错误信息
    print("未知错误:", e)

4. else 和 finally:锦上添花与善后工作

除了tryexcept,还有两个好帮手:elsefinally

  • else:只在try中没有发生任何异常时执行。就像考试没出问题,老师表扬你“真棒!”
  • finally:不管有没有异常,都会执行。就像放学后无论当天表现如何,都要打扫卫生。常用于关闭文件、释放资源。
# 用户输入分数,计算等级
try:
    score = int(input("请输入你的考试分数(0-100):"))  # 用户输入
    if score < 0 or score > 100:
        raise ValueError("分数必须在0-100之间")        # 主动抛出异常
except ValueError as e:
    print("输入错误:", e)   # 捕获所有值错误
else:
    if score >= 90:
        grade = "A"
    elif score >= 80:
        grade = "B"
    else:
        grade = "C"
    print("你的等级是:", grade)
finally:
    print("程序运行结束,再见!")

运行效果:

  • 输入95 → 输出“你的等级是:A”,然后“程序运行结束,再见!”
  • 输入-5 → 输出“输入错误: 分数必须在0-100之间”,然后“程序运行结束,再见!”
  • 输入abc → 同样捕获错误,然后执行finally。

生活例子:你去做蛋糕(try部分),如果成功,你开心地吃蛋糕(else部分);不管成功还是失败,你最后都要洗盘子(finally部分)。

注意else必须放在所有except之后,finally必须放在最后。


5. 完整的异常处理结构:try → except(s) → else → finally

你可以把它们全部组合在一起,形成最强大的异常处理结构:

# 完整示例:计算分数等级,处理各种情况
try:
    score = int(input("请输入你的考试分数(0-100):"))  # 用户输入
    if score < 0 or score > 100:
        raise ValueError("分数超出范围")                # 主动抛出异常
    grade = "A" if score >= 90 else "B" if score >= 80 else "C"
    print("你的等级是:", grade)
except ValueError as e:
    print("输入错误:", e)                             # 捕获值错误
except Exception as e:
    print("未知错误:", e)                             # 兜底
else:
    print("恭喜你,没有异常!")                        # 只有try成功才执行
finally:
    print("无论如何,我都会执行。")                    # 总是执行

运行示例:

  • 输入85 → 输出等级B → “恭喜你,没有异常!” → “无论如何,我都会执行。”
  • 输入-1 → “输入错误: 分数超出范围” → “无论如何,我都会执行。”(else不执行)
  • 输入abc → “输入错误: invalid literal...” → “无论如何,我都会执行。”

新手容易犯的错误

  1. 忘记把可能出错的代码都放进try里。比如把int(input(...))放在外面,用户输入文字时程序直接崩溃。
  2. except后面不写异常类型,导致所有错误被隐藏,找bug困难。
  3. try块里定义变量,在else里使用,但变量可能因为异常而没被创建(比如输入错误,score没赋值)。解决办法:在try外面先声明变量,比如score = None
  4. 滥用except:不加处理,只是pass,这样程序静默忽略错误,很难调试。
# 错误示范:静默忽略所有错误
try:
    num = int(input("数字:"))
except:
    pass  # 什么都不做,错误被吃掉了
print("继续")

这样用户输入abc时,num未定义,后面使用num会报NameError。一定要避免!


6. 一段完整可运行的代码示例(综合所有知识点)

下面是一个“零花钱记账”程序,让用户输入收入和支出,计算结余,并处理各种错误:

# 零花钱记账程序,演示异常处理
balance = 0  # 初始余额

print("欢迎使用零花钱记账系统")
print("请输入你的收入或支出(输入quit退出)")

while True:
    try:
        inp = input("金额:")  # 用户输入
        if inp == "quit":
            break
        amount = float(inp)   # 可能出错:非数字
        if amount == 0:
            raise ValueError("金额不能为0")  # 主动抛出异常
        balance += amount
    except ValueError as e:
        print("输入错误:", e)  # 捕获非数字或金额为0
    except Exception as e:
        print("其他错误:", e)  # 兜底
    else:
        print("当前余额:", balance)  # 只有成功时才显示
    finally:
        print("---")  # 每次输入后都打印分隔线

print("最终余额:", balance)
print("程序结束")

运行示例:

金额:100
当前余额:100.0
---
金额:-50
当前余额:50.0
---
金额:abc
输入错误: could not convert string to float: 'abc'
---
金额:0
输入错误: 金额不能为0
---
金额:quit
最终余额:50.0
程序结束

7. 相关指引

你已经学会了用try-except让程序更稳定。如果想进一步学习,可以探索:

  • 主动抛出异常:用raise语句自己制造异常,就像在游戏中主动叫暂停。
  • 自定义异常:创建自己的错误类型,比如InsufficientFundsError(余额不足错误)。
  • 异常链:在捕获一个异常时抛出另一个异常,保留原始信息。

这些技巧可以让你的程序像“小强”一样,无论遇到什么困难都能爬起来继续跑!加油,未来的编程小高手!

例题精讲

1单选题

以下关于 Python 异常处理 try-except 的语法中,正确的是?

Atry: 可能出错的代码 except: 处理代码
Btry: 可能出错的代码 except 异常类型: 处理代码
Ctry: 可能出错的代码 except: 处理代码 end
Dtry: 可能出错的代码 except 异常类型: 处理代码 finally
2判断题

在 Python 的 try-except 结构中,如果 try 块中的代码没有发生任何异常,那么 except 块中的代码依然会执行。

3填空题
以下代码试图计算两个数的除法,如果除数为零则输出“除数不能为0”。请补全代码。

a = 10
b = 0
try:
    result = a / b
except ___:
    print("除数不能为0")
4单选题

执行以下代码,输出什么? try: x = int("abc") except ValueError: print("值错误") except TypeError: print("类型错误") except: print("其他错误")

A值错误
B类型错误
C其他错误
D程序崩溃,无输出
5填空题
补全以下代码,使其可以捕获所有类型的异常,并输出“发生了一个错误”。注意:不要指定具体异常类型。

try:
    result = 10 / 0
except ___:
    print("发生了一个错误")