python 异常处理
来源:互联网 发布:河南省农产品出口数据 编辑:程序博客网 时间:2024/05/18 18:17
先看这段python代码:
# 第1段代码mydata = []out = open('myfile.txt', 'w+') mydata.append('score') mydata.append(99)print(mydata, file = out)out.close()
这段代码有个问题:当open
或append
失败时,将导致程序崩溃,而这不是我们期望。
我们需要运用到python的异常机制(try ... except ...
),可能我们会写这样的代码
# 第2段代码try: mydata = [] out = open('myfile.txt', 'w+') mydata.append('score') mydata.append(99) print(mydata, file = out) out.close()except Exception as e : print( e )
上面这个代码已经不会因为open
或 append
的失败而导致程序崩溃,但是还有一个问题,那就是当异常发生时,out.close()
不会被执行,这将导致一个句柄的泄漏。
你可能会觉得一个句柄的泄漏没什么大不了的,系统有足够的句柄。这句话对于一个小程序来说有些道理,但是考虑到一个复杂的软件系统而且这个系统可能终年不会被重启,那这样的小泄漏就很严重了。况且,我们应该尽可能追求完美的程序质量。
这个场景催生了另外一个异常处理的结构 try ... except ... finally
,代码可能这样:
# 第3段代码try: mydata = [] out = open('myfile.txt', 'w+') mydata.append('score') mydata.append(99) print(mydata, file = out)except Exception as e : print( e )finally: out.close()
上面这段代码看似没有问题了,但还隐含了另一个逻辑错误,即:当 open('myfile.txt', 'w+')
失败时,finally:
中的 out.close()
将产生异常,因为out此时是无效的。所以,在关闭out这个句柄时,还需要判断这个其是否有效。可利用内置函数locals 进行判断,具体代码如下:
# 第4段代码try: mydata = [] out = open('noexisting.txt') mydata.append('score') mydata.append(99) print(mydata, file = out)except Exception as e : print( e )finally: if 'out' in locals() : # 判断'out'是否在局部变量列表里面 out.close();
到这里,这段代码已经是可用的代码了。
值得一提的是,python提供了 with
语法,自动回收已打开的文件,所以可以有以下这个更简洁的版本:
try: with open('noexisting.txt') as out : mydata.append('score') mydata.append(99)except Exception as e : print( e )
阅读全文
0 0
- Python异常和异常处理
- python异常处理
- Python异常处理
- python 异常处理
- python异常处理
- python如何处理异常
- python之异常处理
- python异常处理
- python异常处理
- Python异常处理
- python异常处理
- python的异常处理
- python的异常处理
- python 异常处理
- python 异常处理
- python 异常处理
- Python异常处理
- Python异常处理
- Hadoop中正常启动了datanode但管理界面却却显示0个datanode节点或者只有本机的一个datanade,DFS Used显示0(100%)
- XDebug配置信息
- Redis的Replication(主从复制)和sentinel机制
- (2)jsp-model1、model1.x(mv)、model2(mvc)
- Java-类的调用
- python 异常处理
- IDEA+Maven+SSH整合小结
- 震撼大气航拍尼亚加拉大瀑布视频素材4K航拍视频素材
- 【linux下 scrapy 安装】Python.h: No such file or directory
- 1065. A+B and C (64bit) (20)
- Twenty Questions UVA
- DroneKit教程(四):属性和参数的读取与设置
- 顺序表
- iOS 长按手势执行两次解决办法