我有以下代码(改编自Dive Into Python中给出的示例),它将文件的全部内容读入缓冲区.
buffer = "" try: file = open(postFileName, 'rU') try: # Read the entire POST log file into a buffer buffer += file.read() finally: file.close() except IOError: buffer += "The POST file could not be opened."
关于这段代码困扰我的是没有except块的内部try/finally块.我需要一个除了块吗?呼叫成功read()
后呼叫是否会失败open()
?我知道try-except-finally现在是统一的,所以添加一个,至少在语法上,不是问题.
如果我添加一个except块,它将在什么条件下执行,以及如何编写测试以确保它在这些条件下运行?
此外,如果我没有需要一个除块,那么为什么还需要内try/finally块呢?
我发现最后块经常被过度使用.文件关闭(以及一些其他类似的模式)非常重要,以至于Python 3.0将使用with语句来覆盖这个基础,而不是那么模糊.
我最后需要一个除外吗?
这取决于这个具体例子的混乱性质,以及为什么他们添加了with语句.
在最后做"不管是什么"的清理工作.异常或无异常,最终总是执行.
在调用open()成功后,对read()的调用是否会失败?
所有OS调用,所有I/O调用(几乎所有内容)都可能引发异常.打开之后和阅读之前都会发生各种不好的事情.
如果我添加一个except块,它将在什么条件下执行?
阅读文件.打开和读取之间可能会发生许多愚蠢的I/O错误.另外,请阅读内置异常. https://docs.python.org/2/library/exceptions.html
如何编写测试以确保它在这些条件下运行?
你需要一个模拟文件对象.这个对象会响应,open
但会引发一个IOError
或OSError
每个read
.
如果我不需要一个except块,那为什么我需要内部的try/finally块呢?
清理.该最终将不管是什么引发异常执行.
试试这个.看看它做了什么.
try: raise OSError("hi mom") finally: print "Hmmm"