保存数据到文件(二)locals(),try...finally save data to file python

来源:互联网 发布:xpspeak41软件下载 编辑:程序博客网 时间:2024/05/01 22:59

如果在程序运行中,遇到异常,则try之后的子句不再运行,若是以当前的程序为例:


如若红色框内的语句发生了错误,则下面的子句即绿色框内的语句就不再执行,直接跳到except语句

如此可以的异常是,文件打开输入内容之后不再关闭,如何来解决这个问题呢?下面引入了finally:

try..finally的用法是:

1. 先执行try下的语句,如若try的语句没有异常,则执行完try语句之后,再执行finally语句。

2. 在执行try下的语句时,如若try下的子句有异常,则抛出这个异常,然后执行finally语句

也就是说无论有无异常,finally语句都是必须执行的。


如若把close的语句放到finally下,则会减少文件损坏的可能,能保证数据完全输出。


但是如果man_file或者是other_file没有赋值成功,亦或许man_data或者other_data的文本文件不存在,则会出现错误信息:

trackback为:name 'man_file' or 'other_file' is not defined.

如何避免掉这个错误呢?我们可以加入逻辑性判断:if 'man_file' in locals():

那么local()函数是什么呢?Python 有两个内置的函数,locals 和 globals,locals提供了基于 dictionary 的访问局部变量的方式; globals提供了基于 dictionary 的访问全局变量的方式。为什么说是基于dictionary呢?因为变量是按dictionary的形式存储在名字空间的。dictinary的键字(key)就是变量名,dictionary的值(value)就是变量的值。


当代码要使用变量 man_file 的值时,Python会到所有可用的名字空间去查找变量:

第一步:局部名字空间 ——特指当前函数或类的方法。如果函数定义了一个局部变量 man_file,python使用这个变量,然后停止搜索。
第二步:全局名字空间——特指当前的模块。如果模块定义了一个名为man_file的变量,函数或类,python将使用这个变量然后停止搜索。
第三步:内置名字空间——对每个模块都是全局的。作为最后的尝试,python将假设man_file是内置函数或变量。

如果Python在这些名字空间找不到 man_file,它将放弃查找并引发一个 NameError 的异常,同时传递 "There is no variable named 'x' "这样的一个traceback。

所以程序改变为:


但是在输出File Error的时候并没有给出确切的异常信息,下面做一些小的改动就可以避免此问题:

except IOError as err:

           print('File Error: ' + err)

用err来作为输出异常信息的一部分。

但是这句话存在异常信息: TypeError: Can't convert 'IOError' object to str implicitly.

也就是说异常对象和字符串不能兼容,那么我们就要调用str()来完成转换:

except IOError as err:

           print('File Error: ' + str(err) )

用str()来强迫异常对象变成字符串类型。

最后输出的异常回馈,我们可以看出确切的异常信息,如下: