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

  1. try:
  2. ...
  3. except KeyError:
  4. raise **Error('') from None
  5.  
  6. try:
  7. ...
  8. except Exception as exc:
  9. raise **Error('') from exc

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

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

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

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

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

  1. try:
  2. print(1/0)
  3. except Exception as exc:
  4. raise RuntimeError('程序执行过程中发生错误') from None
  5.  
  6. Traceback (most recent call last):
  7. File "D:/WorkSpace/backend/user/tests.py", line 7, in <module>
  8. raise RuntimeError('程序执行过程中发生错误') from None
  9. 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. 七天接手react项目 系列

    七天接手react项目 背景 假如七天后必须接手一个 react 项目(spug - 一个开源运维平台),而笔者只会 vue,之前没有接触过 react,此刻能做的就是立刻展开一个"7天 r ...

  2. vmware下的manjaro挂载共享文件夹

    开始时在archwiki上看到的是以下命令 mkdir <shared folders root directory> vmware-hgfsclient vmhgfs-fuse -o a ...

  3. Ubuntu 11.04 LAMP+JSP环境安装过程

    安装LAMP命令:sudo apt-get install apache2 php5 libapache2-mod-php5 mysql-server libapache2-mod-auth-mysq ...

  4. Redis 新特性:多线程模型解读

    Redis 官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注. 主要特性如下: 多线程处理网络 IO: 客户端缓存: 细粒度权限控制(ACL): RESP3  ...

  5. Numpy库基础___三

    ndarray一个强大的N维数组对象Array •ndarray的操作 索引 a = np.arange(24).reshape((2,3,4)) print(a) #[[[ 0 1 2 3] # [ ...

  6. ubuntu忘记密码,用root修改Ubuntu密码

    今天突发奇想,想改一下ubuntu的用户名,仅仅修改了/etc/passwd中的用户名. 改完后没有用命令修改密码,直接reboot了. 结果悲剧了,登不进去了. 赶紧百度一下,结果发现,本宝宝看不懂 ...

  7. [SniperOJ](web)图书管理系统 注入 源码泄露

    0x00 题目概况 题目地址:http://www.sniperoj.cn:10000/ 这是一道注入题,存在git源码泄露,使用githack(freebuf有工具介绍)把源码脱下来,进行审计,然后 ...

  8. Windows 如何打开 .md 文件

    •问题 最近在学习[C++|黑马程序员],对于课堂笔记中的 .md 文档无从下手,要是直接通过 Chrome 打开排版又很乱,且不能正常显示URL中的内容: 这可如何是好??? •解决方案 1. 打开 ...

  9. 【Vulnhub练习】Acid

    靶机信息 下载链接 https://download.vulnhub.com/acid/Acid.rar 靶机说明 Welcome to the world of Acid. Fairy tails ...

  10. markdown类型文件编辑大全

    正文: 1.标题的几种写法: 第一种:     前面带#号,后面带文字,分别表示h1-h6,上图可以看出,只到h6,而且h1下面会有一条横线,注意,#号后面有空格 第二种:      这种方式好像只能 ...