【Python 异常处理】

Python 的异常处理机制是构建健壮程序的核心工具,通过 try-except 结构实现优雅的错误管理。以下是系统化指南:


一、基础异常处理结构

python 复制代码
try:
    # 可能出错的代码
    result = 10 / 0
except ZeroDivisionError:
    # 异常处理逻辑
    print("错误:除数不能为零!")

二、异常处理进阶用法

1. 捕获多个异常类型
python 复制代码
try:
    # 可能引发多种异常的代码
    with open("data.txt") as f:
        data = f.read()
except (FileNotFoundError, UnicodeDecodeError) as e:
    print(f"文件处理失败: {str(e)}")
2. 获取异常对象信息
python 复制代码
try:
    1 / 0
except ZeroDivisionError as e:
    print(f"错误类型: {type(e).__name__}")  # 输出: ZeroDivisionError
    print(f"错误信息: {e}")                # 输出: division by zero
    print(f"错误轨迹: {e.__traceback__}")   # 详细堆栈跟踪
3. else 子句(无异常时执行)
python 复制代码
try:
    num = int(input("输入数字: "))
except ValueError:
    print("输入无效!")
else:
    print(f"平方值: {num**2}")  # 仅当无异常时执行
4. finally 块(始终执行)
python 复制代码
file = None
try:
    file = open("data.txt", "r")
    process(file)
except FileNotFoundError:
    print("文件不存在")
finally:
    if file:
        file.close()  # 确保资源释放
    print("操作结束")

三、高级异常处理技巧

1. 自定义异常类型
python 复制代码
class AuthenticationError(Exception):
    """自定义认证异常"""
    def __init__(self, message="认证失败"):
        self.message = message
        super().__init__(self.message)

# 使用示例
def login(username, password):
    if not validate_credentials(username, password):
        raise AuthenticationError("用户名或密码错误")
2. 异常链(Python 3+)
python 复制代码
try:
    process_data()
except DataError as e:
    raise DatabaseError("数据存储失败") from e  # 保留原始异常
3. 上下文管理器集成
python 复制代码
from contextlib import contextmanager

@contextmanager
def safe_open(path, mode):
    file = None
    try:
        file = open(path, mode)
        yield file
    except Exception as e:
        print(f"文件操作失败: {e}")
        raise
    finally:
        if file:
            file.close()

# 使用示例
with safe_open("data.txt", "r") as f:
    print(f.read())

四、最佳实践原则

  1. 精准捕获

    • 避免裸露的 except:(会捕获所有异常,包括 KeyboardInterrupt)
    • 优先捕获具体异常类型(如 ValueError 而非通用的 Exception
  2. 异常分类处理

    • 业务逻辑异常(如 InvalidInputError)与系统异常(如 ConnectionError)分层处理
  3. 资源清理优先

    • 使用 with 语句自动管理资源(文件/网络连接等)
    • finally 块中执行必需清理操作
  4. 日志记录规范

    python 复制代码
    import logging
    logging.basicConfig(level=logging.ERROR)
    
    try:
        risky_operation()
    except SpecificError as e:
        logging.error("操作失败", exc_info=True)  # 记录完整堆栈
  5. 异常转译

    • 将底层异常转换为业务相关异常:

      python 复制代码
      try:
          db.query("SELECT ...")
      except DatabaseError as e:
          raise UserVisibleError("数据查询失败") from e

五、常见错误模式

1. 空 except 块
python 复制代码
try:
    risky_code()
except:  # 危险!会捕获所有异常
    pass
2. 过度捕获
python 复制代码
try:
    parse_data(user_input)
except Exception:  # 掩盖潜在编程错误
    return default_value
3. 异常信息丢失
python 复制代码
try:
    1 / 0
except ZeroDivisionError:
    raise RuntimeError("计算失败")  # 丢失原始异常信息

六、调试技巧

  1. 查看完整堆栈跟踪

    python 复制代码
    import traceback
    try:
        problematic_code()
    except:
        traceback.print_exc()  # 打印完整错误信息
  2. pdb 调试

    python 复制代码
    import pdb; pdb.set_trace()  # 在异常触发处启动调试器
  3. 异常断言

    python 复制代码
    assert isinstance(value, int), "值必须为整数"

通过合理运用异常处理机制,可以显著提升代码健壮性。建议结合单元测试框架(如 pytest)验证异常处理逻辑,确保关键路径的容错能力。

相关推荐
01漫游者3 分钟前
JavaScript函数与对象增强知识
开发语言·javascript·ecmascript
IGAn CTOU4 分钟前
Java高级开发进阶教程之系列
java·开发语言
leo825...7 分钟前
Claude Code Skills 清单(本地)
java·python·ai编程
csbysj202011 分钟前
SQL NULL 函数详解
开发语言
其实防守也摸鱼14 分钟前
CTF密码学综合教学指南--第三章
开发语言·网络·python·安全·网络安全·密码学
NGSI vimp14 分钟前
Java进阶——如何查看Java字节码
java·开发语言
A7bert77734 分钟前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测
We་ct1 小时前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
skywalk81631 小时前
在考虑双轨制,即在中文语法的基础上,加上数学公式的支持,这样像很多计算将更加简单方便,就像现在的小学数学课本里面一样,比如:定x=2*x + 1
开发语言
小书房1 小时前
Kotlin的by
android·开发语言·kotlin·委托·by