Python 中 raise 和 raise/from 的区别

005-0105-python相关-错误和异常、模块与包 Python错误、异常与模块管理摘要 错误与异常 语法错误:代码解析时发现的错误(如缺少冒号) 异常:运行时检测到的错误(如变量未定义) 异常处理: 使用try-except捕获并处理异常 可捕获特定异常类型并获取错误信息 else子句处理无异常情况 finally确保资源清理 主动抛出异常:raise手动触发异常,assert用于调试断言 模块与包 模块:.py文件,包含变量/函数/类 导入方式:import全导入、from...import部分导入 __name__判断模块执行方式 __all__控制f 阅读详情

raise 与raise..from的区别主要在于:

        在显示错误信息时,raise只显示错误类型,raise...from...还会显示导致错误的原因(原因是from 后面的部分)。

以下转自:https://blog.youkuaiyun.com/jpch89/article/details/84315444#Python__raise__raisefrom__0

文章目录

    Python 中 raise 和 raise/from 的使用方法
        0. 参考资料
        1. 代码比较
        2. 用法解释
            2.1 raise
            2.2 raise A from B
        3. 总结

0. 参考资料

    Python “raise from” usage
    The raise statement
    Built-in Exceptions
 

1. 代码比较

今天在看《Effective Python》的时候第一次见到 raise A from B 的用法,所以在网上查了一下。
下面用代码比较一下 raise 和 raise/from 的区别。

    raise.py

# raise
try:
    raise ValueError
except Exception as e:
    raise IndexError

错误输出为:

"""
Traceback (most recent call last):
  File "raise.py", line 3, in <module>
    raise ValueError
ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "raise.py", line 5, in <module>
    raise IndexError
IndexError
"""

    raisefrom.py

# raise/from
try:
    raise ValueError
except Exception as e:
    raise IndexError from e

错误输出为:

"""
Traceback (most recent call last):
  File "raisefrom.py", line 3, in <module>
    raise ValueError
ValueError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "raisefrom.py", line 5, in <module>
    raise IndexError from e
IndexError
"""

   错误输出比较:

# raise.py
"""
Traceback (most recent call last):
  File "raise.py", line 3, in <module>
    raise ValueError
ValueError

During handling of the above exception, another exception occurred:
## 处理以上异常时,发生另一个异常

Traceback (most recent call last):
  File "raise.py", line 5, in <module>
    raise IndexError
    ## 发出异常的语句
IndexError
"""
##----------------------------------------------------------------##
# raisefrom.py
"""
Traceback (most recent call last):
  File "raisefrom.py", line 3, in <module>
    raise ValueError
ValueError

The above exception was the direct cause of the following exception:
## 上面的异常由下面的异常直接导致

Traceback (most recent call last):
  File "raisefrom.py", line 5, in <module>
    raise IndexError from e
    ## 发出异常的语句
IndexError
"""

根据比较可见,异常输出主要有两个地方不一样(用汉语做注释的地方),其中有意义的不同是两个异常关系的描述,后者指出了两个异常之间的关联关系。

上面的 raise 和 raise/from 都是放在 except 异常处理块中的。
可以观察到 raise 和 raise/from 最大的区别是异常提示信息不一样:

    raise 是:During handling of the above exception, another exception occurred:。
    即“在处理上面的异常时,发生了另外一个异常:”。
    而 raise/from 是:The above exception was the direct cause of the following exception:。
    即“上面的异常是接下来的异常的直接原因:”。

2. 用法解释
2.1 raise

当在 except 块或者 finally 块中出现异常时(包括使用单独的 raise 重新抛出异常的情况),之前的异常会被附加到新异常的 __context__ 属性上。

    except 块中的语句叫做异常处理器 exception handler,它们是处理异常的语句。

而在其他任何地方抛出异常,都不会设置 __context__ 属性。
这样打印出来的异常信息就会包含这么一句话:During handling of the above exception, another exception occurred:。
2.2 raise A from B

raise A from B 语句用于连锁 chain 异常。
from 后面的 B 可以是:

    异常类
    异常实例
    None(Python 3.3 的新特性)

如果 B 是异常类或者异常实例,那么 B 会被设置为 A 的 __cause__ 属性,表明 A异常 是由 B异常 导致的。
这样打印出来的异常信息就会包含这样一句话:The above exception was the direct cause of the following exception:。
与此同时,在 Python 3.3 中 A异常 的 __suppress_context__ 属性会被设置为 True,这样就抑制了 A异常 的 __context__ 属性,即忽略 __context__ 属性。
于是 Python 就不会自动打印异常上下文 exception context,而是使用 __cause__ 属性来打印异常的引发者。

在 Python 3.3 中,B 还可以是 None:raise A异常 from None。
这样相当于把 __suppress_context__ 属性设置为 True,从而禁用了 __context__ 属性,Python 不会自动展示异常上下文。
比如下面这段代码,注意到只显示了 IndexError 一个异常信息:
raisefromnone.py

# raise ... from None
# 禁用异常上下文属性
try:
    raise ValueError
except Exception as e:
    raise IndexError from None
"""
Traceback (most recent call last):
  File "raisefromnone.py", line 6, in <module>
    raise IndexError from None
IndexError
"""

3. 总结

在 except 或者 finally 块中使用 raise 和 raise/from 语句需要注意:

    raise 会设置后面异常的 __context__ 属性为前面的异常。
    异常信息中会有 During handling of the above exception, another exception occurred:。
    raise A异常 from B异常 会把 A异常 的 __cause__ 属性设置为 B异常。
    同时设置 __suppress_context__ 属性为 True,从而忽略 __context__ 属性,不打印异常上下文信息。
    异常信息中会有 The above exception was the direct cause of the following exception:。
    raise A异常 from None 会设置 A异常 的 __suppress_context__ 属性为 True,这样会忽略它的 __context__ 属性,不会自动显示异常上下文信息。
 

ByteTrack参数调优全攻略:从原理到实战(含YOLOv8示例) 本文深入解析了ByteTrack多目标跟踪算法的核心原理与参数调优策略。通过拆解其独特的两阶段关联机制,并结合YOLOv8检测器,提供了针对不同应用场景(如拥挤行人、高速车辆)的精细化参数调整指南与实战示例,旨在帮助开发者解决ID切换、目标丢失等工程落地难题,提升跟踪系统的鲁棒性与实用性。 阅读详情

相关推荐

用Verilog搭出RISC-V架构单周期CPU

这是笔者学校暑期学期的必修课,难度并不高(仅追求及格的话),但相当耗时,对于在硬件设计方面完全不感冒的同学更是一场避不开的折磨,所以笔者想通过自己的成果和被折磨经验来帮助有此方面需求的同学,或是对于CPU设计有浓厚兴趣的人。

paticita的博客 1万+

Python 语法特性|raise ... from 用法说明

Python样例

长行 1603

win11系统ping另一台电脑上VMware虚拟机的IP

我是用了两台电脑,所以刚才遇到一个问题就是两台电脑的IP 在同一局域网内ping不通。于是就找了很多资料,经过坚强的绝望后终于解决了。 下开始解决问题: VMWare提供了三种工作模式:bridged(桥接模式)、NAT(网络地址转换模式)和host-only(主机模式)。 1. bridged(桥接模式)   在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立主机,它可以访问网内任何一台机器。在桥接模式下,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚

qq_42817360的博客 3236

深入探讨Python raise from 语句的使用

作为一名测试工程师,了解如何有效地处理和传递异常是确保代码健壮性的关键。Python 3引入了raise from语句,它允许我们在抛出一个新异常时保留原始异常的上下文信息。本文将详细介绍raise from语句的使用方法、应用场景以及最佳实践。raise from在处理异常时,可能会遇到需要抛出一个新的异常来替代捕获的原始异常的情况。raise from语句提供了一种方式,可以在抛出新异常的同时,保留原始异常的上下文信息。这对于调试和错误追踪非常有帮助。语法raise from的应用场景捕获并转换异常。

霍格沃兹测试学院的博客 1159

紫光同创国产FPGA学习之Fabric Debugger

文章从紫光同创参考书拷贝过来的。因为我用的时候,看了一下就会用了(纯粹只是会用了,默认和xilinx的一样),没有看教程。先更新点文本,后面在写程序。 一、      软件简介 Fabric Debugger是一款界面化的FPGA芯片调试工具,能够针对公司目前以及未来的FPGA芯片进行在线调试。本软件直接与JtagHub、DebugCore交互,能够实时的配置目标FPGA、设置触发条件并且观测结...

my_share的专栏 6388

Deepseek接入QQ机器人:实现拟人化概率回复的完整指南

大语言模型API正在快速改变即时通讯工具的交互方式。通过标准化的OpenAI兼容接口,开发者可以将Deepseek等AI服务嵌入到QQ机器人等IM场景中,实现自然语言对话能力。其核心原理在于事件驱动架构:消息接收层通过OneBot协议获取群聊内容,业务层利用概率过滤与冷却机制控制回复节奏,再由大模型生成拟人化文本。这种设计不仅避免了机器人刷屏,还能通过系统提示词塑造性格,营造真实的社群陪伴体验。适用于粉丝群互动、内容订阅、小规模客服等场景,同时支持多群独立配置、关键词加权回复及上下文记忆扩展。在实际工程中,

weixin_29051245的博客 457

你真的会用raise from吗?90%开发者忽略的关键细节曝光

掌握Python异常处理的 raise from 语句,精准保留原始异常上下文。详解其在嵌套异常、错误转换中的应用,揭示链式异常处理的核心优势与常见误区。提升代码可读性与调试效率,90%开发者忽略的关键细节值得收藏。

PixelGlow的博客 955

基于STM32的智能浇花系统毕业设计(全部资料)

摘要:本文设计了一种基于STM32单片机的智能浇花系统,集成了环境温湿度检测、土壤温湿度监测、LCD显示、Wi-Fi联网及手机APP远程控制等功能。系统通过传感器实时采集环境参数,自动控制水泵工作实现智能灌溉,同时支持用户通过手机APP远程监控和调节。论文详细阐述了硬件选型、软件设计及系统测试过程,验证了系统的稳定性和实用性。该设计为家庭园艺提供了智能化解决方案,具有节水高效、操作便捷等特点。关键词:STM32;智能灌溉;远程控制;环境监测;Wi-Fi通信。

3254968421的博客 1194

Python开发者必知的异常处理技巧(raise from实战全解析)

掌握Python异常处理的 raise from 语句,精准保留原始错误链。详解其在嵌套异常、库开发中的应用场景与链式异常传递优势,提升调试效率。方法清晰,案例实用,值得收藏。

SimSolve的博客 628

FreeRTOS全攻略:从入门到精通

本文聚焦 FreeRTOS,从基础概念出发,阐述其开源、轻量级等优势。着重介绍 FreeRTOS 入门知识,涵盖内存管理、任务操作、同步互斥机制等核心内容。其中,空闲任务与钩子函数保障系统基础运行与功能扩展;队列、信号量、互斥锁和事件组等机制,分别从数据传递、资源访问控制、优先级问题解决及多任务同步等方面,为开发者提供高效的任务间协作与资源管理方案,助力开发者掌握 FreeRTOS 核心技术,为嵌入式项目开发筑牢基础。

邓邓子的博客 6357

Python爬虫技术:使用Playwright和Twitter API v2高效获取Twitter/X数据完全教程

遵守规则:始终遵循Twitter的使用条款和速率限制错误处理:实现完善的错误处理和重试机制数据质量:进行数据清洗和验证性能优化:使用异步处理和合理的延迟设置可维护性:模块化代码,便于维护和扩展。

2201_76125261的博客 671

python里raise是什么意思_Python中raise与raise...from之间有何区别?

本篇文章给大家带来的内容是关于Python中raise 与 raise ... from之间有何区别?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。起步Python 的 raise 和 raise from 之间的区别是什么?try:print(1 / 0)except Exception as exc:raise RuntimeError("Something bad happe...

weixin_36092871的博客 926

(付费请教,防遗忘记录)为什么EDEM bondV1 V2添加后还是没有胶结?????

最近用到了EDEM的胶结功能,在添加了bond V1和V2后,我发现无论颗粒半径设置为多少,接触半径设置为多少,胶结键的参数设置为多少,bond generated数量均为0!!!在后处理中bond中的力也通通为0!!我跟我的同门百思不得其解!!!!最终付费请教了一个大牛,解决了这个问题!!!!答案在文末

zheaa的博客 3099

python中raise和raise e区别_python raise和assert的区别

python中raise和assert的区别一、使用raise抛出异常python可以自动触发异常,raise(内置函数)的定义为显示的抛出异常,用户可以使用raise进行判断,显式的引发异常,raise执行后程序将不再向下执行。式例:#!/usr/bin/env python# -*- coding:utf-8 -*-__author__ = '40kuai'books_dict = {'nam...

weixin_39568133的博客 2082

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python raise 和raise...from的区别

今天在看django的manage.py源码的时候看到这么一句话raise...from ... try: from django.core.management import execute_from_command_line except ImportError as exc: raise ImportError( "Couldn't import Django. Are you sure it's installed and " "available

游客520 3951

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

python中raise和raise e区别_Python中raise 与 raise ... from之间有何区别?

本篇文章给大家带来的内容是关于Python中raise 与 raise ... from之间有何区别?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。起步Python 的 raise 和 raise from 之间的区别是什么?try:print(1 / 0)except Exception as exc:raise RuntimeError("Something bad happe...

weixin_39610807的博客 784

python raise和except区别_python raise和assert的区别

python中raise和assert的区别一、使用raise抛出异常python可以自动触发异常,raise(内置函数)的定义为显示的抛出异常,用户可以使用raise进行判断,显式的引发异常,raise执行后程序将不再向下执行。式例:#!/usr/bin/env python# -*- coding:utf-8 -*-__author__ = '40kuai'books_dict = {'nam...

weixin_39685697的博客 830

【高效调试Python代码】:用raise from构建清晰异常链的3种方法

掌握Python异常处理的 raise from 语句,轻松构建清晰异常链。详解转换异常、保留上下文和嵌套错误处理3种方法,适用于复杂项目调试与日志追踪,提升代码可读性与维护效率,值得收藏。

VarChat的博客 827

从入门到精通:彻底搞懂Python异常传递中的raise from机制

掌握Python异常传递难题,本文深入解析异常处理的 raise from 链机制,涵盖嵌套异常捕获、错误溯源与调试优化等核心场景。通过清晰示例揭示其在复杂调用链中的关键作用,提升代码可维护性,值得收藏。

CodeTrick的博客 857

raise 与 raise ... from 的区别

raise 与 raise ... from 的区别 起步 Python 的 raise 和 raise from 之间的区别是什么? try: print(1 / 0) except Exception as exc: raise RuntimeError("Something bad happened") 输出: Trace...

w1366352655的博客 496

Python | raise...from... 是个什么操作?

点击上方“小詹学Python”,选择“加为星标”第一时间关注Python技术干货!作者:weapon原文:https://zhuanlan.zhihu.com/p/52091476样式...

小詹学python的博客 778

python里raise_Python中raise 与 raise ... from之间有何区别?

本篇文章给大家带来的内容是关于Python中raise 与 raise ... from之间有何区别?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。起步Python 的 raise 和 raise from 之间的区别是什么?try:print(1 / 0)except Exception as exc:raise RuntimeError("Something bad happe...

weixin_39892842的博客 109

你真的会处理异常吗?3分钟搞懂raise from链的关键用法

掌握异常处理的 raise from 链,快速定位嵌套异常根源。本文详解其适用场景与核心用法,揭示清晰追踪错误链的关键优势,提升代码调试效率。异常处理不再头疼,值得收藏。

SimProceed的博客 875

Python异常链背后的秘密:raise from如何重构错误上下文

掌握Python异常链的构建原理,深入解析异常处理的 raise from 链在实际开发中的应用。揭示如何通过 raise from 保留原始错误上下文,精准定位问题源头,提升调试效率。适用于嵌套异常处理、库函数封装等场景,增强代码可维护性,值得收藏。

QuickCode的博客 941

Python异常处理进阶之路:从入门到精通raise from(含真实案例)

掌握Python异常处理的高级技巧,解决复杂错误追踪难题。本文深入解析Python异常处理的raise from语句,涵盖链式异常的适用场景、核心语法与调试优势,提升代码可读性与维护效率。真实案例演示清晰易懂,值得收藏。

ByteShoal的博客 934

【Python异常处理终极指南】:深入掌握raise from的5大核心场景

掌握Python异常处理的精髓,深入解析raise from语句在异常链传递、错误封装、调试优化等5大核心场景的应用。清晰演示如何保留原始异常上下文,提升代码可维护性与排错效率。实用技巧值得收藏。

StepLens的博客 894
上一篇: python 中右移、左移运算符的作用
下一篇: python : itertools 中的 islice : 获取迭代器结果的切片,消耗迭代器
wzg2016
博客等级 码龄10年 539粉丝 493原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值