关于try,finally的使用,以及对Python错误的一些理解。
学过一些时间的Pythoner都知道。Python的错误是一个类,一般的错误都继承与Exception。
一般在项目中,可能会定义一些自定义的类,在一些函数中,通过raise的方式,将该错误进行激活,调用该函数者可以通过try与except指定错误类型的方式来捕获该错误。
今天在写一个函数中需要用到try来抵挡一下异常,对于Python的报错,看来也可以一起好好的学习下。
在常规的认知中,错误只能通过except来处理错误,其实finally同样也可以
还有就是在报错中,一般会存在存在多个报错,就是下面这两条语句
During handling of the above exception, another exception occurred:
简单翻译:正在处理上面的错误时,另外一个整个发生
The above exception was the direct cause of the following exception:
上面的错误是导致以下异常的原因
当看到第一条的时候,我测试发现,一般发生在处理语句,except或finally中,本来except或者finally就是处理异常的,但在处理中自己发生了错误
def t_try(): try: print(123) raise KeyError except Exception as e: raise ValueError # raise Exception() from e finally: ... # error()
上面的代码就将演示出During handling of the above exception, another exception occurred:的情况
Traceback (most recent call last): File "/t_try.py", line 12, in t_try raise KeyError KeyError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/t_try.py", line 23, in <module> r = t_try() File "t_try.py", line 14, in t_try raise ValueError ValueError
本来except是处理try中的错误,但自身错误的。
def t_try(): try: print(123) raise KeyError except Exception as e: raise ValueError from e # raise Exception() from e finally: ... # error()
当改成这种形式之后,报错的中间语句会变成The above exception was the direct cause of the following exception:
因为我用了raise from的形式。
其实可以通过观察是否出现这两个语句来判断,错误是直接发生上浮,还是在处理的过程中发生,对与报错的分析还是有很大的帮助的。
对于错误的理解,我个人认为他就是阻止某线程运行的杀手。当一个错误发生时,它不需要任何的return,就可以通过函数或者模块调用的栈区返回,层层上浮,直到停止该线程的运行,并将其通过stderr的通道输出。
有了这个理解,就可以尝试通过finally去处理error
def t_try(): try: print(123) raise KeyError # except Exception as e: # raise ValueError from e # raise Exception() from e finally: # ... return None
函数默认的如果没有返回,就因为返回None,这个很多人都知道,上面,我写了finally,但却写了 return None,这样就可以将try中的error处理掉,一般的情况下,当一个函数或者模块中,发生了error,会立即截断后续的执行,按照我前面的理解,将自身上浮。但加了finally就不一样了,error必须等待finally的执行完毕以后,才能将自己上浮。在finally中,手工写了return ,这就好比关门打狗了。error还没上浮,finally直接关闭了函数的栈。但加入finally中没有做return,finally中的相关命令执行完毕以后,error还是会通过该函数进行上浮。
对于Python的报错一直没有好好的研究过,是能力的问题也可能是自己平时大意了。
学习汇编确实让我对计算机的运行有了更多自己的思考。
原文地址:https://www.cnblogs.com/sidianok/p/15133091.html
- oc 中随机数的用法(arc4random() 、random()、CCRANDOM_0_1()
- 央行出台条码支付新规;美团打车将在7大城市上线;国产人工智能平台型芯片首发;苹果就降速门致歉
- 阿三又让全球看笑话,无人驾驶的地铁名不副实,还直接跑到大街上
- 盘点:2017年度这些科学大事件,哪个给您印象最深?
- 跳台阶问题
- mac下使用github
- CSS3新特性应用之结构与布局
- 程序猿的日常——Java基础之equals与hashCode
- 贾康:智能金融需在发展和规范中掌握理性权衡点
- Objective-C: 字符串NSString与NSMutableString
- 2017年最后一篇推送,仍然与技术有关盘点深度学习论文年度之“最”
- 【垂直居中高级篇】你不知道的垂直居中方式
- 第一个APP:IOS做简单运算的计算器
- 进程、线程、应用程序之间的关系
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- jQuery根据填写的input的数值导出excel表格
- 解决多种版本python冲突问题
- 探索 App Clips
- ES索引模糊查询
- Dubbo定时任务时间轮(Time Wheel)算法详解
- Vue 中 data 为什么必须是一个函数
- Windows下制作nodejs后台程序的脚本-开机自启动
- Siamese Network & Triplet NetWork
- js常用函数集锦(持续更新)
- 《Java从入门到失业》第五章:继承与多态(5.8-5.10):多态与Object类
- 构建一个适合stm32mp157系列开发板的嵌入式Linux系统
- linux 达梦数据库 命令行 卸载
- Access Control: Database(数据库访问控制)最新解析及完整解决方案
- 启动Apache Atlas时报错
- Apache Atlas 安装部署