raise与raise······from
在python中,如果想手动引发一个异常,我们一般都会使用raise
# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/10/22 10:31
try:
1 / 0
except ZeroDivisionError as e:
raise RuntimeError("error occurred")
"""
Traceback (most recent call last):
File "C:/Users/satori/Desktop/satori/task.py", line 5, in <module>
1 / 0
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/satori/Desktop/satori/task.py", line 7, in <module>
raise RuntimeError("error occurred")
RuntimeError: error occurred
"""
如果这样设置异常的话,During handling of the above exception, another exception occurred:,我们只是看到提示:在处理以上异常的时候,另一个异常产生了。如果我们使用raise .....from...的语法呢?
# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/10/22 10:31
try:
1 / 0
except ZeroDivisionError as e:
raise RuntimeError("error occurred") from e
"""
Traceback (most recent call last):
File "C:/Users/satori/Desktop/satori/task.py", line 5, in <module>
1 / 0
ZeroDivisionError: division by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:/Users/satori/Desktop/satori/task.py", line 7, in <module>
raise RuntimeError("error occurred") from e
RuntimeError: error occurred
"""
The above exception was the direct cause of the following exception:,会直接告诉我们上面异常是下面异常产生的直接原因。
因此我们可以看到两者的不同之处,from会为异常设置一个__cause__属性,表示异常是由谁直接引起的。处理异常的时候出现了新的异常,在不使用from的情况下,更倾向于新异常和旧异常之间没有关联,而from则是能够直接指出新异常是由旧异常直接引起的。这样的话,有助于对异常的分析和排查。但是from有个限制,那就是后面必须跟一个异常的类、或者实例、或者None
# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/10/22 10:31
try:
1 / 0
except ZeroDivisionError as e:
raise RuntimeError("error occurred") from 123
"""
raise RuntimeError("error occurred") from 123
TypeError: exception causes must derive from BaseException
"""
# 提示我们必须from一个BaseException
# 这个BaseException是Exception的父类,Exception继承自BaseException
# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/10/22 10:31
try:
1 / 0
except ZeroDivisionError as e:
raise RuntimeError("error occurred") from IndexError
"""
raise RuntimeError("error occurred") from 123
TypeError: exception causes must derive from BaseException
"""
# 这里是ZeroDivisionError,我可以手动用IndexError引发
但如果我在finally中引发异常
# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/10/22 10:31
try:
1 / 0
except ZeroDivisionError as e:
pass
finally:
raise Exception("xxxx")
"""
Traceback (most recent call last):
File "C:/Users/satori/Desktop/satori/task.py", line 10, in <module>
raise Exception("xxxx")
Exception: xxxx
"""
可以看到只出现了我们自己引发的异常,于是我们可以设置一个traceback
# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/10/22 10:31
try:
1 / 0
except ZeroDivisionError as e:
import sys
tb = sys.exc_info()[2]
finally:
raise Exception("xxxx").with_traceback(tb)
"""
Traceback (most recent call last):
File "C:/Users/satori/Desktop/satori/task.py", line 10, in <module>
raise Exception("xxxx").with_traceback(tb)
File "C:/Users/satori/Desktop/satori/task.py", line 5, in <module>
1 / 0
Exception: xxxx
"""
通过这种方式,会自动帮我们定位到出现异常的语句。这里trackback就是引发异常语句的异常的trackback
我们目前一直在关联异常,那么可不可以禁止异常关联呢?显然是可以的。
# -*- coding:utf-8 -*-
# @Author: WanMingZhu
# @Date: 2019/10/22 10:31
try:
1 / 0
except ZeroDivisionError as e:
raise Exception("xxxx") from None
"""
Traceback (most recent call last):
File "C:/Users/satori/Desktop/satori/task.py", line 7, in <module>
raise Exception("xxxx") from None
Exception: xxxx
"""
只显示了我们自己定义的异常,没有出现During handling of the above exception, another exception occurred:这样的字眼了。
因此在异常处理中,python会为异常设置上下文。但我们也可以手动通过with_traceback()来设置上下文,或者通过from来指定异常是由谁引起的。这些手段都是为了得到更好的异常回溯信息,打印清晰的异常上下文。若忽略上下文,则可以通过raise ···· from···None来禁止自动显示异常上下文。
raise与raise······from的更多相关文章
- raise 与 raise ... from 的区别
起步 Python 的 raise 和 raise from 之间的区别是什么? try: print(1 / 0) except Exception as exc: raise RuntimeErr ...
- python中raise的用法
有关于python里raise显示引发异常的方法: 当程序出错时,python会自动触发异常,也可以通过raise显示引发异常 一旦执行了raise语句,raise之后的语句不在执行 如果加入了try ...
- Python错误调试-raise、assert
raise: raise语句手工引发一个异常:,这样做程序不会因异常而终止,而是运行报错 1 "raise" [expression ["," expressi ...
- python 异常处理函数--raise
Python 异常处理--raise函数用法 在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称.异常名称标识出具体的类: Python异常处理是那些类的对象 ...
- 信号的发送kill,raise,alarm,setitimer,abort,sigqueue
1.kill函数 int kill(pid_t pid, int sig); 发送信号给指定的进程. (1) If pid is positive, then signal sig is sent t ...
- python 基础 6.2 raise 关键字使用
一. raise 关键字 raise 用来触发异常 语法如下: raise[Exception [,args [,traceback]]] 语句中Exception 是异常 ...
- python raise a string exception is deprecated
python不允许raise 一个内建的string 对象.所以就崩溃,可以先将其转换成其他string,比如赋值.
- 解决: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19
错误信息:C:\Python27\lib\site-packages\sklearn\utils\validation.py:395: DeprecationWarning: Passing 1d a ...
- ORACLE RAISE
ORACLE 出错信息的输出 偷懒的办法直接在Exception 后使用raise但是错误信息不是很完整使用RAISE_APPLICATION_ERROR(-20999, DBMS_UTILITY.f ...
随机推荐
- mariadb数据库(1)
一.什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来管理数据库里的数 ...
- Linux 查看Tomcat版本信息
Linux 查看Tomcat版本信息 如果我们想运行在 Linux 下的 Tomcat 版本信息,只需要在 Tomcat 的 bin/ 目录下,运行 version.sh 脚本即可. 1.使用如下命令 ...
- JAVA与c#中byte取值范围的差异
C#中分有符号类型的sbyte和无符号类型的byte Console.WriteLine("byte.min:{0},byte.max:{1},{2}byte", byte.Min ...
- Linux系统管理_主题01 :初识Linux_1.5 与Linux进行交互_echo_nano_Tab_whoami
[root@izkfv3zmvcl0omz ~]# 其中,'root'为登录用户名,'izkfv3zmvcl0omz'为登录主机名,’~’ 表示当前用户正处在 root 用户的 家目录中,’#’则表示 ...
- iptable规则的执行顺序
众所周知,iptable的中包含了各种各样的table和规则链条.这篇博文对规则链的执行顺序做一个简单的介绍. Chain OUTPUT (policy ACCEPT)target prot opt ...
- nginx负载均衡高可用部署和代理配置
nginx负载均衡高可用配置 服务器A:172.16.100.2 服务器B:172.16.100.3 首先先在两台服务器上分别安装好nginx和keepalived后,再进行下面的操作 配置keepa ...
- XCTF攻防世界Web之WriteUp
XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...
- bg_imgae
- shell sed 替代1
sed -e '/-DLUA_USE_LINUX/s/-lreadline/-lreadline -lncurses/g' Makefile > tmp mv tmp Makefile 全局换- ...
- [转帖]公钥基础设施(PKI)/CFSSL证书生成工具的使用
公钥基础设施(PKI)/CFSSL证书生成工具的使用 weilovepan520关注1人评论84344人阅读2018-05-26 12:22:20 https://blog.51cto.com/liu ...