Python3 错误和异常

程序运行时难免出错:除数为 0、文件不存在、下标越界……这些"意外"若不加处理,程序会 直接崩溃。Python 用 try/except 捕获异常并妥善处理,是写出健壮程序的必修课。

错误与异常的区别

  • 语法错误:代码不符合语法规则,解释器直接拒绝执行,根本无法运行。
  • 异常:语法正确,但运行时出了问题(如除数为 0),可用 try/except 捕获处理。

常见异常类型表

异常触发场景例子
ZeroDivisionError除数为 01 / 0
ValueError值不合法int("abc")
TypeError类型不匹配1 + "a"
KeyError字典键不存在{}["k"]
IndexError下标越界[1][5]
FileNotFoundError文件不存在open("x.txt")

try / except 基本结构

try:
    print(10 / 0)        # 触发 ZeroDivisionError
except ZeroDivisionError:
    print("除数不能为 0")  # 输出:除数不能为 0
print("程序继续运行")     # 异常被捕获,程序不中断

一次捕获多个异常

try:
    n = int(input("请输入整数:"))
    print(100 // n)
except (ValueError, ZeroDivisionError):  # 元组列出多种异常
    print("输入必须是合法且非零的整数")

else 与 finally:完整结构

try 没异常才执行 else;finally 无论是否异常都执行,顺序 try → except → else → finally,前三者可按需省略:

try:
    f = open("no.txt", "r")    # 文件不存在
except FileNotFoundError as e:  # as e 拿到异常对象
    print("打开失败:", e)      # 输出:打开失败: [Errno 2] ...
else:
    print("读取成功")          # 没有异常才执行 else
finally:
    print("总是执行")          # 无论是否异常都执行

raise 主动抛出与自定义异常

def set_age(age):
    if age < 0:
        raise ValueError("年龄不能为负数")   # 抛出内置异常
    print(f"年龄设为 {age}")

class BalanceError(Exception):   # 继承 Exception 自定义异常
    pass

def withdraw(money):
    if money > 100:
        raise BalanceError("余额不足")
    return money

# set_age(-1) / withdraw(200) 都会抛出对应异常

异常的传递

未被捕获的异常会沿调用栈逐层向上传递,直到被某处捕获或程序终止:

def inner():
    return 1 / 0       # 在 inner 中抛出

def outer():
    inner()            # inner 不处理,异常传到 outer

try:
    outer()
except ZeroDivisionError:      # 在最外层捕获
    print("异常被外层捕获")    # 输出:异常被外层捕获

小结:用 try/except 捕获可预期的异常,as e 拿异常对象,else 处理无异常分支,finally 负责收尾;需要时用 raise 主动抛出,还可继承 Exception 自定义异常类型。

笔记加载中…