本文目录导读:

在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}")
关键要点
- 始终使用
raise关键字来主动抛出异常 - 选择合适的异常类型 (ValueError, TypeError, RuntimeError等)
- 提供清晰的错误信息,帮助调试和定位问题
- 可以自定义异常类继承自
Exception - 使用异常链 (
from e)保留原始异常信息 - 遵循异常处理最佳实践:不要滥用异常,只在真正的异常情况下使用
这样你就可以在Python代码中有效地抛出和管理异常信息了!