调试程序时看某些库的源代码,发现有如下代码读不懂,不理解后面这个from干什么用的。

try:
...
except KeyError:
raise **Error('') from None try:
...
except Exception as exc:
raise **Error('') from exc

  先看普通写法,控制台会输出什么,结果如下。控制台输出了2个异常发生的位置和原因,同时在2个提示中间输出一句话“在处理上述异常时,又发生了另一个异常”。

try:
print(1/0)
except Exception as exc:
raise RuntimeError('程序执行过程中发生错误') Traceback (most recent call last):
File "D:/*/tests.py", line 5, in <module>
print(1/0)
ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: Traceback (most recent call last):
File "D:/*/tests.py", line 7, in <module>
raise RuntimeError('程序执行过程中发生错误')
RuntimeError: 程序执行过程中发生错误

  再看raise **Error('') from exc写法,控制台输出了什么,结果如下。控制台输出了2个异常发生的位置和原因,同时在2个提示中间输出一句话“上述异常是下列异常的直接原因”。

try:
print(1/0)
except Exception as exc:
raise RuntimeError('程序执行过程中发生错误') from exc Traceback (most recent call last):
File "D:/WorkSpace/backend/user/tests.py", line 5, in <module>
print(1/0)
ZeroDivisionError: division by zero The above exception was the direct cause of the following exception: Traceback (most recent call last):
File "D:/WorkSpace/backend/user/tests.py", line 7, in <module>
raise RuntimeError('程序执行过程中发生错误') from exc
RuntimeError: 程序执行过程中发生错误

  最后看raise **Error('') from None写法,控制台输出了什么,结果如下。控制台只输出了我们写的抛出异常。

try:
print(1/0)
except Exception as exc:
raise RuntimeError('程序执行过程中发生错误') from None Traceback (most recent call last):
File "D:/WorkSpace/backend/user/tests.py", line 7, in <module>
raise RuntimeError('程序执行过程中发生错误') from None
RuntimeError: 程序执行过程中发生错误

  总结:from 会为异常对象设置 __cause__ 属性表明异常的是由谁直接引起的。处理异常时发生了新的异常,在不使用 from 时更倾向于新异常与正在处理的异常没有关系。而 from 则是能指出新异常是因旧异常直接引起的。这样的异常之间的关联有助于后续对异常的分析和排查。from 语法会有个限制,就是第二个表达式必须是另一个异常类或实例。如果在异常处理程序或 finally 块中引发异常,默认情况下,异常机制会隐式工作会将先前的异常附加为新异常的 __context__属性。当然,也可以通过with_traceback()方法为异常设置上下文__context__属性,这也能在traceback更好的显示异常信息。from 还有个特别的用法:raise ... from None ,它通过设置 __suppress_context__ 属性指定来明确禁止异常关联。

  在异常处理程序或finally块中引发异常,可以通过from来指定异常因谁引起的。这些手段都是为了得到更友好的异常回溯信息,打印清晰的异常上下文。若要忽略上下文,则可以通过 raise ... from None 来禁止自动显示异常上下文。

Python raise...from... 是啥?的更多相关文章

  1. python raise a string exception is deprecated

    python不允许raise 一个内建的string 对象.所以就崩溃,可以先将其转换成其他string,比如赋值.

  2. python raise和assert的区别

    python中raise和assert的区别 一.使用raise抛出异常 python可以自动触发异常,raise(内置函数)的定义为显示的抛出异常,用户可以使用raise进行判断,显式的引发异常,r ...

  3. python raise

    当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常.一旦执行了raise语句,raise后面的语句将不能执行.   演示raise用法 try: s = None if s ...

  4. python raise assert

    class MyException(Exception): def __init__(self,error_msg): self.error_msg=error_msg def __str__(sel ...

  5. Python——raise引发异常

    程序出现错误,会自动引发异常,Python也允许使用raise语句自行引发异常. 一.使用raise引发异常 单独一个raise引发异常,默认引发RuntimeError异常,例: try: prin ...

  6. Python 2.7.x 和 3.x 版本的重要区别

    许多Python初学者都会问:我应该学习哪个版本的Python.对于这个问题,我的回答通常是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本.等学得差不多了,再 ...

  7. python开发_python关键字

    python3.3.2中的关键字如下: The following identifiers are used as reserved words, or keywords of the languag ...

  8. python_38_try-except异常处理语句及raise的使用

    # i=10 # print(30/(i-10)) # #程序将会出现以下报错信息 # # Traceback (most recent call last): # # File "C:/U ...

  9. create python project steps

    Setting Up Your First Project You don't have to manually create the structure above, many tools will ...

随机推荐

  1. think php 修改页面

    表单页面 <a href="/examtest/test/edit/id/{$v['id']}">修改</a> <a href="/exam ...

  2. 记一次mybatis-plus遇到的问题

    在用了 springboot 和 mybatis-plus很久之后, 有一天突然看到配置文件有点繁杂, 想将相同的配置拉到application.yml里, 就在将配置拉过去后, 问题就开始出现了. ...

  3. java高并发之ConcurrentSkipListMap的那些事

    注意:本文内容基于JDK11,不同版本会有差异 ConcurrentSkipListMap的结构 ConcurrentSkipListMap是以链表(自然排序)的形式进行数据存储的.即在类中通过定义N ...

  4. Apache BeanUtils与Spring BeanUtils性能比较

    在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进行属性 ...

  5. JavaWeb 05_JDBC入门及连接MySQL

    一.概念 *概念:  Java DataBase Connectivity       Java数据库连接, Java语言操作数据库* JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数 ...

  6. ModSecurity的规则

    一.ModSecurity的规则 基本格式 SecRule VARIABLES OPERATOR ACTIONS SecRule:ModSecurity主要的指令,用于创建安全规则. VARIABLE ...

  7. 一个最简单的Dubbo入门框架

    Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 1.单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本 ...

  8. Blazor 003 : Razor的基础语法

    上文,我们通过剖析一个最简单的 Blazor WASM 项目,讲明白了 Razor 文件是什么,以及它被转译成 C#后长什么样子.也介绍了 Razor 中最简单的一个语法:Razor Expressi ...

  9. 一图学Python

    网上有这样一张图片,信息量很大,通常会被配上标题"一张图让你学会Python": 这张图流传甚广,但我没有找到明确的出处,图片上附带了 UliPad 的作者 Limodou 的信息 ...

  10. Ajax的乱码解决问题?

    Javascript是使用UTF-8国际编码,即每个汉字用4个字节来存储,这就造成了用AJAX来send数据的时候出现会乱码. Ajax乱码产生主要有2个原因 1. XMLHttpRequest返回的 ...