Python中的异常处理机制
字数 656 2025-11-05 23:47:54

Python中的异常处理机制

描述
异常处理是Python中处理程序运行时错误的重要机制。当程序执行过程中出现错误(如除零、文件不存在、索引越界等),Python会抛出异常。如果不处理这些异常,程序会终止执行。Python提供了try/except/finally/else结构来捕获和处理异常,保证程序的健壮性。

异常处理的基本结构

try:
    # 可能抛出异常的代码块
    risky_operation()
except ValueError as e:
    # 处理特定类型的异常
    print(f"值错误: {e}")
except (TypeError, ZeroDivisionError):
    # 处理多种类型的异常
    print("类型错误或除零错误")
except Exception as e:
    # 处理所有其他异常
    print(f"其他错误: {e}")
else:
    # 没有异常发生时执行
    print("操作成功")
finally:
    # 无论是否发生异常都会执行
    print("清理工作")

详细步骤解析

  1. try块 - 监控异常

    • try块包含可能抛出异常的代码
    • 执行顺序:从上到下执行try块内的语句
    • 一旦某条语句抛出异常,后续代码不会执行
  2. except块 - 捕获异常

    • 可以有多个except块处理不同类型的异常
    • 匹配规则:按顺序检查异常类型,执行第一个匹配的except块
    • 异常类继承关系:Exception ← ArithmeticError ← ZeroDivisionError
    • 可以使用元组同时捕获多种异常
  3. else块 - 无异常时执行

    • 只有当try块没有抛出异常时执行
    • 适合放置那些依赖try块成功执行的代码
    • 与在try块末尾写代码的区别:else块中的异常不会被前面的except捕获
  4. finally块 - 清理资源

    • 无论是否发生异常都会执行
    • 常用于释放资源(关闭文件、数据库连接等)
    • 即使有return语句,finally块也会执行

异常处理示例

def divide_numbers(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("错误:除数不能为零")
        return None
    except TypeError as e:
        print(f"类型错误:{e}")
        return None
    else:
        print(f"计算结果:{result}")
        return result
    finally:
        print("除法运算完成")

# 测试用例
divide_numbers(10, 2)    # 正常情况
divide_numbers(10, 0)    # 除零错误
divide_numbers(10, "2")  # 类型错误

自定义异常

class MyCustomError(Exception):
    """自定义异常类"""
    def __init__(self, message, code):
        super().__init__(message)
        self.code = code

def validate_age(age):
    if age < 0:
        raise MyCustomError("年龄不能为负数", 1001)
    if age > 150:
        raise MyCustomError("年龄不合理", 1002)
    return True

try:
    validate_age(-5)
except MyCustomError as e:
    print(f"自定义错误 {e.code}: {e}")

异常处理的最佳实践

  1. 具体异常优先

    # 不推荐
    try:
        # 某些操作
    except Exception:
        pass
    
    # 推荐
    try:
        # 某些操作
    except FileNotFoundError:
        # 处理文件不存在
    except PermissionError:
        # 处理权限错误
    
  2. 避免空的except块

    # 不推荐 - 隐藏错误
    try:
        risky_call()
    except:
        pass
    
    # 推荐 - 至少记录错误
    try:
        risky_call()
    except Exception as e:
        logger.error(f"操作失败: {e}")
    
  3. 使用异常链

    try:
        1 / 0
    except ZeroDivisionError:
        raise ValueError("计算错误") from None
    

异常处理是编写健壮Python程序的关键技能,合理的异常处理可以让程序在遇到错误时优雅地降级或恢复,而不是直接崩溃。

Python中的异常处理机制 描述 异常处理是Python中处理程序运行时错误的重要机制。当程序执行过程中出现错误(如除零、文件不存在、索引越界等),Python会抛出异常。如果不处理这些异常,程序会终止执行。Python提供了try/except/finally/else结构来捕获和处理异常,保证程序的健壮性。 异常处理的基本结构 详细步骤解析 try块 - 监控异常 try块包含可能抛出异常的代码 执行顺序:从上到下执行try块内的语句 一旦某条语句抛出异常,后续代码不会执行 except块 - 捕获异常 可以有多个except块处理不同类型的异常 匹配规则:按顺序检查异常类型,执行第一个匹配的except块 异常类继承关系:Exception ← ArithmeticError ← ZeroDivisionError 可以使用元组同时捕获多种异常 else块 - 无异常时执行 只有当try块没有抛出异常时执行 适合放置那些依赖try块成功执行的代码 与在try块末尾写代码的区别:else块中的异常不会被前面的except捕获 finally块 - 清理资源 无论是否发生异常都会执行 常用于释放资源(关闭文件、数据库连接等) 即使有return语句,finally块也会执行 异常处理示例 自定义异常 异常处理的最佳实践 具体异常优先 避免空的except块 使用异常链 异常处理是编写健壮Python程序的关键技能,合理的异常处理可以让程序在遇到错误时优雅地降级或恢复,而不是直接崩溃。