it编程 > 前端脚本 > Python

Python主动抛出异常的各种用法和场景分析

8人参与 2025-06-11 Python

一、为什么要主动抛出异常?

主动抛出异常(也称为"引发异常")的主要目的是:

二、基本语法:raise关键字

使用raise关键字可以主动抛出异常:

异常类型可以自己定义,通过class定义。

raise 异常类型(错误信息)

基本示例

def divide(a, b):
    if b == 0:
        # valueerror是内置的异常类型,就不需要自己定义了
        raise valueerror("除数不能为零")
    return a / b

try:
    result = divide(10, 0)
except valueerror as e:
    print(f"捕获到错误: {e}")

三、raise的多种用法

1. 抛出内置异常

def get_element(lst, index):
    if index >= len(lst):
        # indexerror错误类型因为他原本就有所以不用class定义
        raise indexerror("索引超出列表范围")
    return lst[index]

# 使用
try:
    get_element([1, 2, 3], 5)
except indexerror as e:
    print(e)  # 输出:索引超出列表范围

2. 重新抛出当前异常

在except块中,可以使用不带参数的raise重新抛出当前异常:

try:
    10 / 0
except zerodivisionerror:
    print("发生了除以零错误,记录日志后重新抛出")
    raise  # 重新抛出相同的异常

3. 抛出异常链

python 3引入了异常链的概念,可以使用from关键字:

def process_file(filename):
    try:
        with open(filename) as f:
            return f.read()
    except ioerror as e:
        raise runtimeerror("文件处理失败") from e

try:
    process_file("nonexistent.txt")
except runtimeerror as e:
    print(f"主错误: {e}")
    print(f"原始原因: {e.__cause__}")  # 访问原始异常

四、自定义异常的抛出

我们经常需要定义自己的 **异常类型 **来更好地表达特定的错误情况:

# 自定义一个异常类型(invalidemailerror),以及异常消息
class invalidemailerror(exception):
    """当电子邮件格式无效时抛出"""
    pass

def send_email(email):
    if "@" not in email:
        raise invalidemailerror(f"无效的邮箱地址: {email}")
    # 发送邮件逻辑...

try:
    send_email("userexample.com")  # 缺少@符号
except invalidemailerror as e:
    print(f"邮件发送失败: {e}")

五、raise的进阶用法

1. 带参数的异常

class temperatureerror(exception):
    def __init__(self, temp, min_temp, max_temp):
        self.temp = temp
        self.min_temp = min_temp
        self.max_temp = max_temp
        super().__init__(f"温度{temp}超出范围({min_temp}-{max_temp})")

def check_temperature(temp):
    if not (0 <= temp <= 100):
        raise temperatureerror(temp, 0, 100)
    print("温度正常")

try:
    check_temperature(-5)
except temperatureerror as e:
    print(f"错误温度: {e.temp}, 允许范围: {e.min_temp}-{e.max_temp}")

2. 条件性抛出异常

def process_age(age):
    if not isinstance(age, int):
        raise typeerror("年龄必须是整数")
    if age < 0:
        raise valueerror("年龄不能为负数")
    if age < 18:
        print("未成年人")
    else:
        print("成年人")

# 测试
for age in [15, 25, -3, "20"]:
    try:
        process_age(age)
    except (typeerror, valueerror) as e:
        print(f"无效输入: {e}")

六、raise与assert的区别

特性raiseassert
目的主动引发异常用于调试,检查不应为假的条件
生产环境应该使用通常不应使用(可能被-o禁用)
语法raise 异常类型("消息")assert 条件, "消息"
引发异常任何异常类型总是assertionerror
适用场景处理预期的错误情况检查程序内部一致性

assert示例

def calculate_average(numbers):
    assert len(numbers) > 0, "数字列表不能为空"
    return sum(numbers) / len(numbers)

# 等同于
def calculate_average(numbers):
    if len(numbers) == 0:
        raise valueerror("数字列表不能为空")
    return sum(numbers) / len(numbers)

七、实际应用案例

1. api参数验证

def create_user(username, email):
    if not username:
        raise valueerror("用户名不能为空")
    if len(username) < 3:
        raise valueerror("用户名至少需要3个字符")
    if "@" not in email:
        raise valueerror("无效的邮箱格式")
    
    print(f"创建用户: {username}, 邮箱: {email}")

try:
    create_user("ab", "invalid-email")
except valueerror as e:
    print(f"用户创建失败: {e}")

2. 数据库操作

class databaseerror(exception):
    pass

class connectionerror(databaseerror):
    pass

class queryerror(databaseerror):
    pass

def execute_query(query):
    if not query.startswith("select"):
        raise queryerror("只支持select查询")
    # 模拟连接失败
    if "fail" in query:
        raise connectionerror("数据库连接失败")
    print(f"执行查询: {query}")

queries = ["select * from users", "update users", "select fail"]
for query in queries:
    try:
        execute_query(query)
    except connectionerror as e:
        print(f"连接问题: {e}")
    except queryerror as e:
        print(f"查询错误: {e}")

八、最佳实践

总结

主动抛出异常是python编程中的强大工具,它可以帮助我们:

记住原则:当函数无法完成其宣称的功能时,应该抛出异常。通过合理使用raise,你可以写出更专业、更可靠的python代码!

以上就是python主动抛出异常的各种用法和场景分析的详细内容,更多关于python主动抛出异常的资料请关注代码网其它相关文章!

(0)

您想发表意见!!点此发布评论

推荐阅读

Python中dict遍历的方法详解

06-11

一文全面详解Python变量作用域

06-11

Python使用glob库批量匹配文件路径

06-11

Python标准库中email模块的使用方法与内部机制详解

06-11

Python使用sort()方法对数组进行排序的操作指南

06-11

Python编写邮件自动发送工具的完整指南

06-11

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论