Python raise...from... 是啥?
调试程序时看某些库的源代码,发现有如下代码读不懂,不理解后面这个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... 是啥?的更多相关文章
- python raise a string exception is deprecated
python不允许raise 一个内建的string 对象.所以就崩溃,可以先将其转换成其他string,比如赋值.
- python raise和assert的区别
python中raise和assert的区别 一.使用raise抛出异常 python可以自动触发异常,raise(内置函数)的定义为显示的抛出异常,用户可以使用raise进行判断,显式的引发异常,r ...
- python raise
当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常.一旦执行了raise语句,raise后面的语句将不能执行. 演示raise用法 try: s = None if s ...
- python raise assert
class MyException(Exception): def __init__(self,error_msg): self.error_msg=error_msg def __str__(sel ...
- Python——raise引发异常
程序出现错误,会自动引发异常,Python也允许使用raise语句自行引发异常. 一.使用raise引发异常 单独一个raise引发异常,默认引发RuntimeError异常,例: try: prin ...
- Python 2.7.x 和 3.x 版本的重要区别
许多Python初学者都会问:我应该学习哪个版本的Python.对于这个问题,我的回答通常是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本.等学得差不多了,再 ...
- python开发_python关键字
python3.3.2中的关键字如下: The following identifiers are used as reserved words, or keywords of the languag ...
- python_38_try-except异常处理语句及raise的使用
# i=10 # print(30/(i-10)) # #程序将会出现以下报错信息 # # Traceback (most recent call last): # # File "C:/U ...
- create python project steps
Setting Up Your First Project You don't have to manually create the structure above, many tools will ...
随机推荐
- Python 递归函数返回值为 None 的解决办法
在使用 Python 开发的过程中,避免不了会用到递归函数.但递归函数的返回值有时会出现意想不到的情况. 下面来举一个例子: >>> def fun(i): ... i += 1 . ...
- LGP6146题解
思维僵化了,习惯按照右端点排序,没想到是按照左端点排序... 考虑从左到右依次加入线段,考虑贡献. 设前 \(i\) 条线段的答案为 \(dp[i]\). 考虑两种情况: 不加,贡献为 \(dp[i- ...
- 4月19日 python学习总结 套接字模块的使用
服务端: import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买电话 phone.bind(('127.0.0 ...
- python+pytest接口自动化(11)-测试函数、测试类/测试方法的封装
前言 在python+pytest 接口自动化系列中,我们之前的文章基本都没有将代码进行封装,但实际编写自动化测试脚本中,我们都需要将测试代码进行封装,才能被测试框架识别执行. 例如单个接口的请求代码 ...
- Mycat+MySql 主从复制-读写分离 看这一篇就够了
通过mycat和mysql的主从复制配合搭建数据库的读写分离,可以实现mysql的高可用性,下面我们来搭建mysql的读写分离. 1.一主一从 1.在node01上修改/etc/my.cnf的文件 ...
- Oracle 数据库应用开发 30 忌
原创 LaoYuanPython CSDN 今天 作者 | LaoYuanPython 责编 | 欧阳姝黎出品 | CSDN原力计划 引言 笔者及所在团队从 2000 年开始的 CRM 等 ...
- 如果一个 linux 新手想要知道当前系统支持的所有命令的列表,他需要怎么做?
使用命令 compgen -c,可以打印出所有支持的命令列表. [root@localhost ~]$ compgen -cl.lllswhichifthen elseelifficaseesacfo ...
- 如何使用 Spring Boot 实现异常处理?
Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法. 我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常.
- BLOB 和 TEXT 有什么区别?
BLOB 是一个二进制对象,可以容纳可变数量的数据.TEXT 是一个不区分大小写 的 BLOB. BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小 写,对 TEX ...
- Linux 基础优化
1.操作的最小化原则 1)安装系统最小化 一般情况下安装OS时,软件安装包组(Package Group)的选择: base--------------------------基本环境 editors ...