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 主动抛出异常

异常处理的本质是:

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


相关推荐
程序员爱钓鱼7 小时前
Python编程实战 - 面向对象与进阶语法 - 类方法与静态方法
后端·python
鬼火儿8 小时前
MySQL系列之数据类型(String)
java·后端
程序新视界8 小时前
MySQL的隔离级别及其工作原理详解
数据库·后端·mysql
IT_陈寒8 小时前
Redis 7.0的这个新特性让我处理百万级QPS轻松了50%,你可能还不知道!
前端·人工智能·后端
蓝-萧8 小时前
【Java】如何使用jdbc连接并操作MySQL,一文读
java·后端
qianbailiulimeng8 小时前
【MySQL】mysqldump使用方法
java·后端
Victor3568 小时前
Redis(102)Redis的单线程性能为什么这么高?
后端
JaguarJack8 小时前
PHP 现代特性速查 写出更简洁安全的代码(第一篇)
后端·php
Victor3568 小时前
Redis(103)Redis的最大并发连接数是多少?
后端