Python 异常处理完全指南
目录
- 一、异常处理基础
- 1. 基本语法结构
- 二、常见异常类型
- 1. 内置异常层次
- 2. 常见异常示例
- 三、多重异常处理
- 1. 合并捕获
- 2. 分层处理
- 四、finally与else子句
- 1. finally 应用场景
- 2. else 使用技巧
- 五、自定义异常
- 1. 创建异常类
- 2. 异常继承体系
- 六、异常链与上下文
- 1. raise from 语法
- 2. 异常上下文查看
- 七、最佳实践与陷阱
- 综合实战案例
一、异常处理基础
1. 基本语法结构
try:
# 可能引发异常的代码
result = 10 / 0
except ZeroDivisionError:
# 处理特定异常
print("不能除以零!")
except Exception as e:
# 通用异常处理
print(f"发生错误: {e}")
else:
# 无异常时执行
print("计算成功")
finally:
# 始终执行的清理代码
print("清理资源")
- 异常传播机制
二、常见异常类型
1. 内置异常层次
所有异常类都继承 BaseException
BaseException
├── KeyboardInterrupt
├── SystemExit
└── Exception
├── ArithmeticError
│ ├── ZeroDivisionError
│ └── FloatingPointError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── OSError
│ ├── FileNotFoundError
│ └── PermissionError
└── ValueError
2. 常见异常示例
# 文件操作
try:
with open("nonexist.txt") as f:
content = f.read()
except FileNotFoundError:
print("文件不存在")
# 类型转换
try:
num = int("abc")
except ValueError:
print("无效的数字格式")
# 字典操作
d = {"key": "value"}
try:
print(d["missing"])
except KeyError:
print("键不存在")
三、多重异常处理
1. 合并捕获
try:
# 可能抛出多种异常的代码
except (TypeError, ValueError) as e:
print(f"输入类型错误: {e}")
2. 分层处理
try:
data = json.loads(invalid_json)
except json.JSONDecodeError:
print("JSON解析失败")
except Exception:
print("其他未知错误")
四、finally与else子句
1. finally 应用场景
file = None
try:
file = open("data.txt", "r")
process(file)
except IOError:
print("文件操作错误")
finally:
if file:
file.close() # 确保资源释放
2. else 使用技巧
try:
result = risky_operation()
except NetworkError:
handle_error()
else:
save_result(result) # 仅在成功时执行
五、自定义异常
1. 创建异常类
class InvalidEmailError(ValueError):
"""自定义邮箱格式异常"""
def __init__(self, email):
super().__init__(f"无效邮箱格式: {email}")
self.email = email
# 使用示例
email = "user@"
if "@" not in email or "." not in email.split("@")[1]:
raise InvalidEmailError(email)
2. 异常继承体系
class DatabaseError(Exception):
"""数据库操作基类异常"""
class ConnectionError(DatabaseError):
"""数据库连接异常"""
class QueryError(DatabaseError):
"""SQL查询异常"""
六、异常链与上下文
1. raise from 语法
try:
config = load_config()
except FileNotFoundError as e:
raise RuntimeError("配置加载失败") from e
2. 异常上下文查看
try:
# 可能出错的代码
except Exception as e:
print("原始异常:", e.__cause__)
print("上下文:", e.__context__)
七、最佳实践与陷阱
✅ 推荐做法
- 具体异常捕获优先
- 添加有意义的错误信息
raise ValueError(f"无效参数值: {value}")
- 日志记录异常
import logging
try:
process()
except Exception:
logging.exception("处理失败")
⚠️ 避免陷阱
- 捕获过于宽泛的异常
try:
...
except: # 捕获所有异常,包括KeyboardInterrupt
pass
- 忽略异常
try:
...
except Exception:
pass # 静默失败
- 重复抛出异常
try:
...
except Exception as e:
print(e)
raise # 保留原始堆栈信息
综合实战案例
网络请求重试机制
import requests
from time import sleep
def fetch_data(url, retries=3):
for attempt in range(retries):
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
return response.json()
except requests.HTTPError as e:
print(f"HTTP错误: {e}")
except requests.Timeout:
print("请求超时")
except requests.RequestException:
print("网络连接问题")
if attempt < retries - 1:
sleep(2 ** attempt) # 指数退避
raise Exception(f"请求失败,已重试{retries}次")
# 使用示例
data = fetch_data("https://api.example.com/data")
通过掌握这些异常处理技巧,您可以:
- 编写更健壮的程序
- 提高错误诊断效率
- 创建更友好的用户交互体验
- 构建可维护的异常处理体系
建议在实际开发中结合具体业务场景,设计合理的异常处理策略,并定期审查异常处理代码的有效性