【转】简单介绍Python中的try和finally和with方法
用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何问题, 比如文件无法打开, 或是读取出错, 那么在函数内需要捕获所有异常, 输出一行警告并退出. 代码可能一开始看起来是这样的:
def read_file(): try: f = open('yui', 'r') print ''.join(f.readlines()) except: print 'error occurs while reading file' finally: f.close()
不过这显然无法运作, 因为 f 是在 try 块中定义的, 而在 finally 中无法引用.
如果将 f 提取到 try 块外部, 如
def read_file(): f = open('azusa', 'r') try: print ''.join(f.readlines()) except: print 'error occurs while reading file' finally: f.close()
那么, 问题在于当打开文件失败, 抛出异常将不会被捕获.
挫一点的方法自然是, 再套一层 try 吧
def read_file(): try: f = open('sawako', 'r') try: print ''.join(f.readlines()) except: print 'error occurs while reading file' finally: f.close() except: print 'error occurs while reading file'
当然这不仅仅是多一层缩进挫了, 连警告输出都白白多一次呢.
正规一点的方式是, 使用 Python 引入的 with 结构来解决, 如
def readFile(): try: with open('mio', 'r') as f: print ''.join(f.readlines()) except: print 'error occurs while reading file'
当文件打开失败时, 异常自然会被 except 到; 否则, 在 with 块结束之后, 打开的文件将自动关闭.