Python编程实战 - 面向对象与进阶语法 - 异常类型与捕获

156 阅读3分钟

在 Python 编程中,错误是不可避免的。无论是输入错误、文件不存在,还是除以零等问题,程序运行时都可能发生异常(Exception)。 如果不处理这些异常,程序会直接崩溃,导致用户体验和系统稳定性下降。 因此,掌握异常处理机制,是编写健壮 Python 程序的重要一环。


一、什么是异常(Exception)

异常指程序运行过程中出现的错误。 与语法错误不同,异常是在程序运行时触发的错误

例如:

print(10 / 0)

执行结果:

ZeroDivisionError: division by zero

这说明 Python 检测到了“除以零”的错误并抛出了一个异常对象。


二、常见的异常类型

Python 内置了多种异常类型,常见的有以下几类:

异常类型说明
ZeroDivisionError除以零时发生
TypeError类型不匹配
ValueError无效的数值参数
IndexError索引越界
KeyError字典中查找不存在的键
FileNotFoundError打开的文件不存在
AttributeError调用不存在的属性或方法
NameError使用未定义的变量
IOError输入输出错误
ImportError导入模块失败
RuntimeError一般性的运行时错误

示例:

lst = [1, 2, 3]
print(lst[5])  # IndexError

三、捕获异常 try...except

为了防止异常导致程序崩溃,我们可以使用 try...except 块捕获并处理异常。

try:
    x = int(input("请输入一个数字:"))
    y = 10 / x
    print("结果:", y)
except ZeroDivisionError:
    print("错误:除数不能为零!")
except ValueError:
    print("错误:请输入有效的数字!")

运行效果:

请输入一个数字:0
错误:除数不能为零!

✅ 程序不会崩溃,能够优雅地处理异常。


四、同时捕获多个异常

当你想同时处理多种异常类型时,可以把它们放在同一个 except 中:

try:
    num = int("abc")
except (TypeError, ValueError):
    print("类型或值错误!")

五、获取异常信息

有时我们需要查看异常的具体信息,可以用 as 关键字:

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print("发生异常:", e)

输出:

发生异常: division by zero

六、finally:无论是否出错都执行

finally 块常用于释放资源,例如关闭文件、断开网络连接等。

try:
    f = open("data.txt", "r")
    content = f.read()
except FileNotFoundError:
    print("文件不存在!")
finally:
    print("无论是否出错,都会执行这里")

输出:

文件不存在!
无论是否出错,都会执行这里

✅ 即使出现异常,finally 中的代码也一定会执行。


七、else:没有异常时执行

try 块中代码正常执行时,可以进入 else 块。

try:
    x = 5
    y = 2
    print(x / y)
except ZeroDivisionError:
    print("除数不能为零!")
else:
    print("没有异常,成功执行!")
finally:
    print("程序结束。")

输出:

2.5
没有异常,成功执行!
程序结束。

八、抛出自定义异常

有时我们希望主动抛出异常,用于提示特定错误,可以使用 raise

def withdraw(balance, amount):
    if amount > balance:
        raise ValueError("余额不足!")
    balance -= amount
    return balance

try:
    withdraw(100, 200)
except ValueError as e:
    print("异常提示:", e)

输出:

异常提示: 余额不足!

✅ 这种方式常用于输入验证、接口返回检查等场景。


九、自定义异常类

如果内置异常不够表达业务语义,可以创建自定义异常类:

class InsufficientFundsError(Exception):
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        super().__init__(f"余额不足,当前余额 {balance},取款 {amount}")

try:
    raise InsufficientFundsError(100, 300)
except InsufficientFundsError as e:
    print("捕获到自定义异常:", e)

输出:

捕获到自定义异常: 余额不足,当前余额 100,取款 300

十、总结

关键字作用
try包含可能出错的代码
except捕获并处理异常
else没有异常时执行
finally无论是否异常都执行
raise主动抛出异常

异常处理的本质是:

让程序从“出错崩溃”变为“可控应对”,从而提升健壮性与可靠性。