一、异常处理基础
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")
通过掌握这些异常处理技巧,您可以:
- 编写更健壮的程序
- 提高错误诊断效率
- 创建更友好的用户交互体验
- 构建可维护的异常处理体系
建议在实际开发中结合具体业务场景,设计合理的异常处理策略,并定期审查异常处理代码的有效性
总结
到此这篇关于python异常处理操作的文章就介绍到这了,更多相关python异常处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论