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

Python异常参数详解:捕获、传递与自定义异常信息 - Python教程

Python异常参数详解

掌握异常捕获、参数传递与自定义异常处理

什么是异常参数?

在Python中,当异常被引发时,可以附带一个参数(通常是一个字符串或对象),提供有关异常的额外信息。这个参数可以通过except语句捕获,并用于错误处理。

基本语法:

try:
    # 可能引发异常的代码
except ExceptionType as e:
    # e 就是异常参数
    print(f"发生错误: {e}")

捕获异常参数

使用as关键字可以将异常对象赋值给一个变量,通过该变量可以访问异常参数。

示例:捕获除零错误

try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"错误类型: {type(e).__name__}")
    print(f"错误信息: {e}")
    print(f"详细参数: {e.args}")

输出结果:

错误类型: ZeroDivisionError
错误信息: division by zero
详细参数: ('division by zero',)

传递异常参数

在自定义异常或重新抛出异常时,可以传递自定义参数,提供更丰富的错误信息。

示例:创建自定义异常类

class InvalidAgeError(Exception):
    """当年龄无效时引发的异常"""
    def __init__(self, age, message="年龄必须在0-120之间"):
        self.age = age
        self.message = message
        super().__init__(self.message)
    
    def __str__(self):
        return f"{self.age} -> {self.message}"

def register_user(age):
    if not (0 <= age <= 120):
        raise InvalidAgeError(age)
    print(f"用户年龄 {age} 注册成功")

try:
    register_user(150)
except InvalidAgeError as e:
    print(f"注册失败: {e}")
    print(f"无效年龄: {e.age}")

输出结果:

注册失败: 150 -> 年龄必须在0-120之间
无效年龄: 150

异常参数最佳实践

1. 提供有意义的错误信息

在引发异常时,提供清晰、具体的错误信息,帮助调试和问题定位。

raise ValueError("文件格式不支持,仅接受.jpg或.png格式")

2. 使用内置异常类型

优先使用Python内置的异常类型(如ValueError、TypeError等),除非有特殊需求才创建自定义异常。

if not isinstance(value, int):
    raise TypeError("参数必须是整数类型")

3. 记录完整异常信息

在捕获异常时,记录完整的异常信息,包括堆栈跟踪。

import traceback

try:
    # 代码逻辑
except Exception as e:
    traceback.print_exc()  # 打印完整堆栈信息
    logger.error(f"发生错误: {e}\n{traceback.format_exc()}")

4. 异常链

在捕获异常后重新引发时,使用raise ... from ...保留原始异常信息。

try:
    # 操作数据库
except DatabaseError as e:
    raise ApplicationError("数据处理失败") from e

高级应用:多参数异常

Python异常可以携带多个参数,提供更详细的错误上下文信息。

示例:文件处理异常

class FileProcessingError(Exception):
    def __init__(self, filename, line_number, message):
        self.filename = filename
        self.line_number = line_number
        self.message = message
        super().__init__(f"{filename}:{line_number} - {message}")

def process_file(filename):
    try:
        with open(filename, 'r') as file:
            for i, line in enumerate(file, 1):
                if 'error' in line:
                    raise FileProcessingError(filename, i, "检测到错误关键字")
    except FileNotFoundError:
        raise FileProcessingError(filename, 0, "文件不存在")

try:
    process_file("data.txt")
except FileProcessingError as e:
    print(f"文件处理失败: {e}")
    print(f"文件名: {e.filename}")
    print(f"行号: {e.line_number}")
    print(f"原因: {e.message}")

总结:Python异常处理要点

  • 使用except Exception as e捕获异常参数
  • 自定义异常类时重写__init____str__方法
  • 异常信息应包含足够上下文(文件名、行号、错误值等)
  • 使用raise ... from ...保留原始异常链
  • 避免捕获过于宽泛的异常(如except:

发表评论