Python中的raise关键字详解

 更新时间:2025年04月14日 15:20:28   作者:Yant224  
这篇文章主要介绍了Python中的raise关键字,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、核心语法解析

1.1 基础语法形式

raise [异常类型[(参数)]]

用法说明​​

  • 只能存在于异常处理块(exceptfinally)内部
  • 自动重新抛出当前捕获的异常
  • 保持原始异常堆栈信息

1.2 完整语法结构

raise [异常类型[(参数)]] [from 原因]

二、基础用法场景

2.1 触发内置异常

# 参数校验场景
def calculate_square(n):
    if not isinstance(n, (int, float)):
        raise TypeError("必须传入数值类型")
    return n ​**​ 2

# 调用示例
calculate_square("5")  # 触发 TypeError

三、高级用法技巧

3.1 异常链(Exception Chaining)

import json

try:
    config = json.load(open('config.json'))
except FileNotFoundError as fnf_error:
    raise RuntimeError("配置文件加载失败") from fnf_error

# 错误输出显示关联关系
# RuntimeError: 配置文件加载失败
# The above exception was the direct cause of...

3.2 自定义异常触发python

class NetworkTimeout(Exception):
"""自定义网络超时异常"""
	def __init__(self, host, timeout):
	    self.host = host
	    self.timeout = timeout
	    super().__init__(f"连接 {host} 超时({timeout}s)")

# 触发自定义异常
if response_time > 30:
	raise NetworkTimeout("api.example.com", 30)

四、特殊形式详解

4.1 无异常类型抛出

def deprecated_feature():
    raise "该功能已废弃"  # ❌ 错误!必须抛出 Exception 实例

# 正确做法
def deprecated_feature():
    raise DeprecationWarning("该功能已废弃")

4.2 异常参数传递

try:
    raise ValueError("无效输入", 404, {"detail": "ID不合法"})
except ValueError as e:
    print(e.args)  # ('无效输入', 404, {'detail': 'ID不合法'})

五、常见使用模式

5.1 防御式编程

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

5.2 API 错误处理

def fetch_data(url):
    response = requests.get(url)
    if 400 <= response.status_code < 500:
        raise ClientError(response.status_code, response.text)
    elif response.status_code >= 500:
        raise ServerError(response.status_code)
    return response.json()

六、最佳实践指南

6.1 异常类型选择原则

错误场景推荐异常类型
参数类型错误TypeError
参数值无效ValueError
文件操作错误IOError
业务规则违反自定义异常

6.2 异常消息规范

# 不推荐
raise ValueError("错误发生")

# 推荐格式
raise ValueError(f"参数 {param} 的值 {value} 超出有效范围(允许范围:{min}~{max})")

七、注意事项

from 参数使用​​

# 显示原始异常原因
raise ParsingError from original_error

性能考量​​

  • 避免在循环中频繁抛出异常
  • 异常处理耗时是条件判断的 10-100

调试辅助​​

# 打印完整堆栈
import traceback
try:
    risky_call()
except:
    traceback.print_exc()
    raise  # 重新抛出

八、综合应用示例

8.1 数据验证链

def validate_user(user):
    if not user.get('username'):
        raise ValueError("用户名必填")
    if len(user['password']) < 8:
        raise SecurityError("密码至少8位")
    if not re.match(r"[^@]+@[^@]+\.[^@]+", user['email']):
        raise FormatError("邮箱格式无效")
    return True

8.2 上下文管理器

class Transaction:
    def __enter__(self):
        if not self.conn.is_valid():
            raise ConnectionError("数据库连接失效")
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type:
            self.rollback()
            raise TransactionError("事务执行失败") from exc_val
        self.commit()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 从入门到精通浅析Python如何统计代码覆盖率

    从入门到精通浅析Python如何统计代码覆盖率

    代码覆盖率是一个衡量指标,用来描述在运行测试套件(Test Suite)时,你的源代码被“执行”了多少比例,在 Python 中,最主流的覆盖率测量工具是 coverage.py,下面小编就和大家简单介绍一下吧
    2026-05-05
  • Pandas分组聚合之使用自定义函数方法transform()、apply()

    Pandas分组聚合之使用自定义函数方法transform()、apply()

    Pandas具有很多强大的功能,transform就是其中之一,利用它可以高效地汇总数据且不改变数据行数,下面这篇文章主要给大家介绍了关于Pandas分组聚合之使用自定义函数方法transform()、apply()的相关资料,需要的朋友可以参考下
    2023-01-01
  • numpy 计算两个数组重复程度的方法

    numpy 计算两个数组重复程度的方法

    今天小编就为大家分享一篇numpy 计算两个数组重复程度的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Django小白教程之Django用户注册与登录

    Django小白教程之Django用户注册与登录

    这篇文章主要介绍了Django小白教程之Django用户注册与登录的相关资料,需要的朋友可以参考下
    2016-04-04
  • Python读取数据集并消除数据中的空行方法

    Python读取数据集并消除数据中的空行方法

    今天小编就为大家分享一篇Python读取数据集并消除数据中的空行方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 在Python程序中进行文件读取和写入操作的教程

    在Python程序中进行文件读取和写入操作的教程

    这篇文章主要介绍了在Python程序中进行文件读取和写入操作的教程,是Python学习当中的基础知识,需要的朋友可以参考下
    2015-04-04
  • python自定义异常类方式

    python自定义异常类方式

    这篇文章主要介绍了python自定义异常类方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 对Python中TKinter模块中的Label组件实例详解

    对Python中TKinter模块中的Label组件实例详解

    今天小编就为大家分享一篇对Python中TKinter模块中的Label组件实例详解,具有很好的价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • uv介绍以及与anaconda/venv的区别及说明

    uv介绍以及与anaconda/venv的区别及说明

    uv是Rust开发的极速Python包管理工具,整合虚拟环境、依赖解析等功能,替代pip和venv,提升速度与效率,适配纯Python项目,Anaconda专注科学计算的跨语言依赖管理,venv+pip则保持轻量与兼容性
    2025-07-07
  • Python获取多进程执行的返回值实现

    Python获取多进程执行的返回值实现

    本文主要介绍了Python获取多进程执行的返回值实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论