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 ...
随机推荐
- Python-sympy科学计算与数据处理(求极限及其它功能)
极限 其它功能
- 利用Oracle定时任务重置序列
业务需求是:二元化编号规则:RYH+年月+001(开始),按月计算,每月1号重置为001 数据库中已有序列和函数如下: 解决方法:采用Oracle定时任务,每月1号重置该序列从1开始增长,SQL如下: ...
- Canal——原理架构及应用场景
Canal简介 Canal是阿里开源的一款基于Mysql数据库binlog的增量订阅和消费组件,通过它可以订阅数据库的binlog日志,然后进行一些数据消费,如数据镜像.数据异构.数据索引.缓存更新等 ...
- launchImage设置后在启动时无法显示
有人问我他的APP设置了启动页,然后居然不显示.....我觉得应该不可能啊,然后我自己再次实现了一下设置启动页,这个问题好像以前从来没有注意过,也没有很深刻的掌握APP启动页的设置和注意事项,今天遇到 ...
- Apriori算法--Python实现
# -*- coding: utf-8 -*- """ Created on Mon Nov 05 22:50:13 2018 @author: ZhuChaochao ...
- vue自定义过滤器的创建与使用
原文地址 过滤器:生活中有很多例子,净水器 空气净化器 .过滤器的作用:实现数据的筛选.过滤.格式化. vue1.*版本是有内置的过滤器,但是在vue2.*所有的版本都已经没有自带的过滤器了. 1.过 ...
- mysq的慢查询日志
MySQL 慢查询日志是排查问题 SQL 语句,以及检查当前 MySQL 性能的一个重要功能. 查看是否开启慢查询功能: mysql> show variables like 'slow_que ...
- Linux安装git (git-2.11.0)
本文旨在讲述如何在linux上安装最新版的git. 1.查看当前git版本:git --version 查看最新版git:访问https://www.kernel.org/pub/softwa ...
- Springboot Actuator之一:执行器Actuator入门介绍
介绍 Spring Boot有四大神器,分别是auto-configuration.starters.cli.actuator,本文主要讲actuator.actuator是spring boot提供 ...
- python列表与字符串、元组的区别以及列表引用的方式
一.字符串 字符串也可以用下标取值.切片.for循环.len()取长度以及 in 和 not in 来进行操作. 但字符串是不可变的,不能被更改.只能构造一个“新的”字符串来存取你想要修改后的数据. ...