在软件开发中,我们无法预料所有运行时错误:文件可能不存在、网络连接可能中断、用户输入可能出错...... 为了让程序在异常情况下仍能优雅地运行,Python 提供了强大的异常处理机制 ------
try...except...finally。
本文将带你系统掌握 Python 的异常捕获与处理流程,并结合实例讲解 try、except、finally 的使用技巧与最佳实践。
一、为什么要用异常处理?
如果程序在运行过程中遇到错误而没有被处理,Python 会抛出异常并终止程序执行。 例如:
python
print("开始计算...")
result = 10 / 0
print("结果:", result)
运行结果:
vbnet
开始计算...
ZeroDivisionError: division by zero
程序在第二行报错,后续代码无法执行。 这时我们可以使用 try...except 来捕获错误,防止程序崩溃。
二、try...except 的基本语法
python
try:
# 可能发生异常的代码
result = 10 / 0
except ZeroDivisionError:
# 当发生 ZeroDivisionError 时执行
print("除数不能为0!")
运行结果:
除数不能为0!
程序不会中断,异常被优雅地处理。
三、多个 except 分支捕获不同异常
你可以使用多个 except 来分别处理不同类型的异常:
python
try:
num = int(input("请输入一个数字:"))
result = 10 / num
except ValueError:
print("输入的不是数字!")
except ZeroDivisionError:
print("除数不能为0!")
except Exception as e:
print("发生未知错误:", e)
✅ 优点:
- 可根据错误类型定制不同提示;
Exception可兜底捕获所有未明确声明的异常。
四、使用 finally 块 ------ 无论是否出错都执行
有时我们希望即使出错,也要执行某些操作(例如:关闭文件、释放资源、断开数据库连接等)。 这时就用 finally:
python
try:
f = open("data.txt", "r")
content = f.read()
print(content)
except FileNotFoundError:
print("文件不存在!")
finally:
f.close()
print("文件已关闭。")
即使文件不存在导致异常,finally 也会始终执行。
五、try...except...else 的组合用法
else 块可与 try 一起使用,表示"没有发生异常时执行":
python
try:
num = int(input("请输入数字:"))
except ValueError:
print("输入错误!")
else:
print(f"你输入的数字是 {num}")
执行顺序如下:
| 语句块 | 是否执行条件 |
|---|---|
| try | 总是执行 |
| except | 发生异常时执行 |
| else | 未发生异常时执行 |
| finally | 总是执行(无论是否异常) |
六、嵌套的 try 语句
在实际开发中,try 块可以嵌套使用:
python
try:
f = open("data.txt", "r")
try:
content = f.read()
print(content)
except UnicodeDecodeError:
print("文件编码错误!")
finally:
f.close()
print("文件已关闭。")
except FileNotFoundError:
print("文件不存在!")
这种结构可在多层操作中,分别处理不同阶段的异常。
七、raise 主动抛出异常
有时我们希望手动触发异常来提醒调用者。例如:
python
def divide(a, b):
if b == 0:
raise ValueError("除数不能为0!")
return a / b
try:
print(divide(10, 0))
except ValueError as e:
print("错误:", e)
输出:
错误: 除数不能为0!
八、实战案例:文件读取与异常处理
下面是一个更接近真实项目的示例:
python
def read_file(filename):
try:
f = open(filename, "r", encoding="utf-8")
except FileNotFoundError:
print("❌ 文件不存在,请检查路径。")
else:
print("✅ 文件读取成功:")
print(f.read())
finally:
try:
f.close()
print("📁 文件已关闭。")
except:
print("⚠️ 无法关闭文件(可能未成功打开)。")
read_file("example.txt")
这个示例展示了一个完整的异常处理结构:
- 使用
try...except捕获文件打开错误; - 用
else处理正常逻辑; - 在
finally中确保资源释放。
九、总结与最佳实践
| 关键点 | 建议 |
|---|---|
✅ try...except |
捕获已知错误,避免程序崩溃 |
✅ finally |
用于清理资源(文件、网络连接等) |
✅ else |
仅在无异常时执行逻辑 |
⚠️ except Exception |
谨慎使用,避免掩盖错误 |
⚙️ raise |
主动抛出错误,增强函数健壮性 |
✨ 结语
try...except...finally 是 Python 异常处理体系的核心,它能让你的程序在面对错误时不慌乱、不崩溃、可控可恢复。 掌握它,你就能写出更加健壮、安全、可维护的 Python 程序。