抛出异常 #

使用raise语句主动抛出异常。

一、基本用法 #

python
# 抛出异常
raise ValueError("值错误")

# 重新抛出异常
try:
    result = 10 / 0
except ZeroDivisionError:
    raise  # 重新抛出当前异常

二、条件抛出 #

python
def set_age(age):
    if age < 0:
        raise ValueError("年龄不能为负数")
    if age > 150:
        raise ValueError("年龄不合理")
    return age

def divide(a, b):
    if b == 0:
        raise ZeroDivisionError("除数不能为零")
    return a / b

三、自定义异常 #

python
class InsufficientFundsError(Exception):
    """余额不足异常"""
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        super().__init__(f"余额不足:当前{balance},需要{amount}")

class BankAccount:
    def __init__(self, balance):
        self.balance = balance
    
    def withdraw(self, amount):
        if amount > self.balance:
            raise InsufficientFundsError(self.balance, amount)
        self.balance -= amount
        return amount

try:
    account = BankAccount(100)
    account.withdraw(200)
except InsufficientFundsError as e:
    print(e)  # "余额不足:当前100,需要200"

四、异常链 #

python
def parse_data(data):
    try:
        return int(data)
    except ValueError as e:
        raise TypeError("数据转换失败") from e

try:
    parse_data("abc")
except TypeError as e:
    print(e)        # "数据转换失败"
    print(e.__cause__)  # 原始异常

五、最佳实践 #

python
# 1. 使用具体的异常类型
def validate_score(score):
    if not 0 <= score <= 100:
        raise ValueError(f"分数必须在0-100之间,当前:{score}")

# 2. 异常消息要清晰
raise FileNotFoundError(f"配置文件不存在:{filename}")

# 3. 自定义异常继承Exception
class MyError(Exception):
    """自定义错误"""
    pass

# 4. 保留原始异常信息
try:
    risky_operation()
except SomeError as e:
    raise NewError("新错误") from e
最后更新:2026-03-16