在 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 |
主动抛出异常 |
异常处理的本质是:
让程序从"出错崩溃"变为"可控应对",从而提升健壮性与可靠性。