Python案例如何抛出异常信息?

wen python案例 11

本文目录导读:

Python案例如何抛出异常信息?

  1. 使用 raise 关键字
  2. 自定义异常类
  3. 重新抛出异常
  4. 在异常链中传递信息
  5. 使用 assert 断言
  6. 格式化异常信息
  7. 实际应用示例
  8. 关键要点

在Python中抛出异常信息主要有以下几种方式:

使用 raise 关键字

抛出内置异常

# 抛出值错误
raise ValueError("输入的值不合法")
# 抛出类型错误
raise TypeError("参数类型错误")
# 抛出运行时错误
raise RuntimeError("运行时出现了问题")

条件判断后抛出

def divide(a, b):
    if b == 0:
        raise ZeroDivisionError("除数不能为零")
    return a / b
# 使用
try:
    result = divide(10, 0)
except ZeroDivisionError as e:
    print(f"错误信息: {e}")

自定义异常类

# 定义自定义异常
class InvalidAgeError(Exception):
    """年龄不合法异常"""
    def __init__(self, age, message="年龄不合法"):
        self.age = age
        self.message = message
        super().__init__(self.message)
# 使用自定义异常
def set_age(age):
    if age < 0 or age > 150:
        raise InvalidAgeError(age, f"年龄 {age} 不在0-150范围内")
    print(f"年龄设置成功: {age}")
# 测试
try:
    set_age(200)
except InvalidAgeError as e:
    print(f"错误: {e.message}, 年龄值: {e.age}")

重新抛出异常

def process_data(data):
    try:
        result = int(data)  # 可能抛出 ValueError
        return result
    except ValueError:
        # 记录日志后重新抛出
        print(f"转换失败: {data}")
        raise  # 重新抛出原始异常
# 或抛出新的异常
def validate_input(value):
    try:
        if value < 0:
            raise ValueError(f"值不能为负数: {value}")
    except ValueError:
        # 转换为自定义异常
        raise RuntimeError(f"输入验证失败: {value}")

在异常链中传递信息

def load_config(filename):
    try:
        with open(filename, 'r') as f:
            return f.read()
    except FileNotFoundError as e:
        raise RuntimeError(f"无法加载配置文件: {filename}") from e
# 使用
try:
    config = load_config("config.txt")
except RuntimeError as e:
    print(f"加载失败: {e}")
    print(f"原始异常: {e.__cause__}")

使用 assert 断言

def check_positive(num):
    assert num > 0, f"数字 {num} 必须大于0"
    return num ** 2
# 断言失败时会抛出 AssertionError
try:
    check_positive(-5)
except AssertionError as e:
    print(f"断言失败: {e}")

格式化异常信息

def calculate_bmi(weight, height):
    if weight <= 0:
        raise ValueError(f"体重必须大于0,当前值: {weight}")
    if height <= 0:
        raise ValueError(f"身高必须大于0,当前值: {height}")
    bmi = weight / (height ** 2)
    return bmi
# 使用 f-string 格式化错误信息
def process_user_data(user_data):
    required_fields = ['name', 'age', 'email']
    for field in required_fields:
        if field not in user_data:
            raise KeyError(f"缺少必填字段 '{field}',请检查数据完整性")

实际应用示例

class BankAccount:
    def __init__(self, balance=0):
        if balance < 0:
            raise ValueError("初始余额不能为负数")
        self.balance = balance
    def withdraw(self, amount):
        if amount <= 0:
            raise ValueError(f"取款金额必须为正数,当前金额: {amount}")
        if amount > self.balance:
            raise InsufficientFundsError(
                f"余额不足,需要 {amount},实际余额 {self.balance}",
                self.balance, amount
            )
        self.balance -= amount
        return self.balance
class InsufficientFundsError(Exception):
    def __init__(self, message, balance, amount):
        self.balance = balance
        self.amount = amount
        super().__init__(message)
# 测试
try:
    account = BankAccount(100)
    account.withdraw(150)
except InsufficientFundsError as e:
    print(f"交易失败: {e}")
    print(f"当前余额: {e.balance}, 试图取出: {e.amount}")

关键要点

  1. 始终使用 raise 关键字来主动抛出异常
  2. 选择合适的异常类型 (ValueError, TypeError, RuntimeError等)
  3. 提供清晰的错误信息,帮助调试和定位问题
  4. 可以自定义异常类继承自 Exception
  5. 使用异常链 (from e)保留原始异常信息
  6. 遵循异常处理最佳实践:不要滥用异常,只在真正的异常情况下使用

这样你就可以在Python代码中有效地抛出和管理异常信息了!

抱歉,评论功能暂时关闭!