夜樱

python异常处理机制[try/expect/finally]
原本开开心心打算白嫖作业了,当死线(ddl)快到了的时候发来,一检查代码我整个人傻了怎么会有报错。改了将近半小时排...
扫描右侧二维码阅读全文
25
2019/11

python异常处理机制[try/expect/finally]

原本开开心心打算白嫖作业了,当死线(ddl)快到了的时候发来,一检查代码我整个人傻了怎么会有报错。
改了将近半小时排查问题 了解机制以及跟同学辩论,总算是结束了,于是拿来水文了。

蛮有意思的问题围绕着异常捕获机制的写法以及变量问题

为什么要白嫖?自己写不好么?

因为这段时间有各种原因因素还一直偷懒,导致很多事情其实应该做但是没去做。
本来挺简单的作业,但是因为自身一些复杂原因就只打算白嫖了(反正能理解也会做)。其实按理来说不该这样,但是因为繁杂的问题也不好解释原因就打算白嫖同学的。

事情的起因

滴滴滴(文件发来的消息声)
我:啊 终于来了 可以交作业了
(接收,ok,打开来看看文件ing.....)
我:? ??,怎么这边有警告?

一看警告信息:

怎么报错了草.png

这里是全部代码

问题发现.png

哦应该是局部变量有问题。

于是交流了下,结果。。。

发言1.png

我:??? 有这样的么,try expect的捕获难道不分变量区域的么 ???

结果查出来还是区域变量的问题草,进行改正后代码总算是正常了。

解决后:
解决.png

Python 异常捕获处理机制[try/expect/finally]

什么是异常?
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。 一般情况下,在Python无法正常处理程序时就会发生一个异常。 异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

异常处理
捕捉异常可以使用try/except语句。
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。

异常处理最基本执行顺序:
1.先try领域内运行
2.try里面的代码遇到报错后跳转执行expect捕获错误
3.如有finally则先捕获执行玩expcet里面的代码后跳转执行finally里的

具体参考: 错误和异常

以上 最基本是要了解的

后来我去官方文档上看了看关于try的工作机制企图获得关于变量域的内容,然而并没看到具体说法
try工作机制.jpg

但是可以看到一个关键的地方,文档指出了"子句"这个关键词,也就是说在捕获异常的方法中也是分为多块不同的区域,也就是说在一个子句内部定义的变量在expectfinally的过程下变量之间无法共享,那么最后也就无法在产生报错后及时关闭文件源,这样就可能会造成一些问题(具体没了解过,但开后关闭是一种习惯)。

所以在try/expect/finally下的变量作用域就成这样:

#外面为全局作用域  
try;
    {try语句中的局部(私有)作用域}
expect:
    {expect捕获异常后的局部(私有)作用域}
finally:
    {finally捕获异常后执行最后的代码中的局部(私有)作用域}

#切记每一个都是块语句,一个块语句充当一个局部作用域

那么就不难理解警告里说的变量并未定义的问题,很明显就是局部变量产生的问题,本身Python作为一个高级语言在本身特点上就是对缩进问题以及变量适用领域有着严格的检查,只要缩进或者是局部变量概念弄混都会容易写出有问题的代码

所以我们将文件打开后 给予一个变量"f"将其赋值后作为一个全局变量,再进行try方法的异常处理即可 这样子产生错误捕获后进行finally操作就不会产生访问不到定义的f变量的问题。

当然作为一个高级功能方便我们使用,异常捕获本身的性能效率开销是非常大的,所以不推荐滥用会导致代码运行效率大打折扣。关于try....expect的性能开销问题可以参考这篇文章

Python异常(try...except)对代码运行性能的影响

个人感觉过来还算是一个不错的讲解

说起来还真这还真是个挺蛋疼的问题,遇到了那就纪录一下吧
在IO操作中打开了文件一定要在最后给予闭合哦~

Last modification:November 27th, 2019 at 09:57 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment