当前位置: 首页 > news >正文

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. 异常传播机制
触发异常
当前代码有try块?
匹配except
向调用栈上层传播
执行对应处理
到达顶层?
程序崩溃

二、常见异常类型

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__)

七、最佳实践与陷阱

推荐做法

  1. 具体异常捕获优先
  2. 添加有意义的错误信息
raise ValueError(f"无效参数值: {value}")
  1. 日志记录异常
import logging
try:process()
except Exception:logging.exception("处理失败")

⚠️ 避免陷阱

  1. 捕获过于宽泛的异常
try:...
except:  # 捕获所有异常,包括KeyboardInterruptpass
  1. 忽略异常
try:...
except Exception:pass  # 静默失败
  1. 重复抛出异常
try:...
except Exception as e:print(e)raise  # 保留原始堆栈信息

综合实战案例

网络请求重试机制

import requests
from time import sleepdef 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")

通过掌握这些异常处理技巧,您可以:

  • 编写更健壮的程序
  • 提高错误诊断效率
  • 创建更友好的用户交互体验
  • 构建可维护的异常处理体系

建议在实际开发中结合具体业务场景,设计合理的异常处理策略,并定期审查异常处理代码的有效性


http://www.mrgr.cn/news/96053.html

相关文章:

  • Ardupilot开源无人机之Geek SDK进展2025Q2
  • ESP32驱动BMP280和MQ4传感器
  • javafx项目结构+代码规范
  • Tabby 一:如何在Mac配置保姆级教程(本地模型替换hugging face下载)
  • 【大模型系列篇】使用Python开发MCP Server及Inspector工具调试
  • 【docker】docker-compose安装RabbitMQ
  • 我的世界1.20.1forge模组开发进阶教程——序列化(1)
  • Python SciPy面试题及参考答案
  • NanoGraphrag原理和数据流讲解
  • Maya到SubstancePainter再到UE5
  • MQTT之重复消息产生
  • Android HAL 架构详解,底层开发不再难
  • idea 快捷键
  • AI 算力计算方式
  • 微信小程序登录和获取手机号
  • SSML(Speech Synthesis Markup Language)简介
  • 【C++指针】搭建起程序与内存深度交互的桥梁(下)
  • STM32 MODBUS-RTU主从站库移植
  • 微信小程序学习
  • Vue3项目中的.vscode文件夹