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

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


一、什么是异常(Exception)

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

例如:

python 复制代码
print(10 / 0)

执行结果:

vbnet 复制代码
ZeroDivisionError: division by zero

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


二、常见的异常类型

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

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

示例:

python 复制代码
lst = [1, 2, 3]
print(lst[5])  # IndexError

三、捕获异常 try...except

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

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

运行效果:

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

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


四、同时捕获多个异常

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

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

五、获取异常信息

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

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

输出:

csharp 复制代码
发生异常: division by zero

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

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

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

输出:

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

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


七、else:没有异常时执行

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

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

输出:

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

八、抛出自定义异常

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

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

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

输出:

复制代码
异常提示: 余额不足!

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


九、自定义异常类

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

python 复制代码
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 主动抛出异常

异常处理的本质是:

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


相关推荐
Looooking18 分钟前
Python 之获取安装包所占用磁盘空间大小
python
WenGyyyL26 分钟前
ColBERT论文研读——NLP(IR)里程碑之作
人工智能·python·语言模型·自然语言处理
JavaGuide29 分钟前
MiniMax M2.7 发布!Redis 故障排查 + 跨语言重构场景实测,表现如何?
redis·后端·ai·ai编程
lxy-up29 分钟前
RAG--切片策略
python
ricky_fan36 分钟前
(OpenAI)Codex 安装、部署使用方式
python·macos·conda·vim
小王不爱笑13238 分钟前
Java 对象拷贝(浅拷贝 / 深拷贝)
java·开发语言·python
架构师沉默42 分钟前
程序员真的要失业了吗?
java·后端·架构
于先生吖43 分钟前
SpringBoot+Vue 前后端分离短剧漫剧系统开发实战
vue.js·spring boot·后端
shengjk11 小时前
我用 EXISTS 把一条 SQL 从 18 秒优化到 6 秒,同事以为我改了索引
后端