2008-12-17 71 views
4

我有下面的代码(改编自Dive Into Python给出的例子),它将文件的全部内容读入缓冲区。如何测试Python中的file.read()错误?

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." 

什么是这个代码困扰我是内部try/finally块没有一个except块。我需要一个除了在那里的块吗?拨打open()成功后,可否致电read()失败?我知道try-except-finally现在是统一的,因此至少在语法上加一个不是问题。

如果我添加一个except块,在什么条件下它会被执行,以及如何编写一个测试以确保它在这些条件下运行?

此外,如果我需要一个除了块,那么为什么我需要内部try/finally块呢?

回答

6

我发现finally块是经常被滥用。关闭文件(以及一些其他类似的模式)非常重要,Python 3.0将有一个声明只是为了覆盖这个基地,不太模糊。

  • 我需要一个除了最后?

    这引起了这个具体例子的混淆,以及为什么他们添加了声明。

    终于做“不管是什么”清理。例外或不例外,总是执行终于

  • 调用open()成功后,调用read()是否失败?

    所有OS调用,所有I/O调用(几乎所有)都会引发异常。各种不好的事情可能会在开放之前和阅读之前发生。

  • 如果我添加一个块,除了块,在什么条件下它会被执行?

    阅读文件。在打开和读取之间会出现很多愚蠢的I/O错误。另外,请阅读内置的例外情况。 https://docs.python.org/2/library/exceptions.html

  • 如何编写测试以确保其在这些条件下运行?

    您需要一个模拟文件对象。该对象将响应open,但会在每个read上产生一个IOErrorOSError

  • 如果我不需要一个except块,那么为什么我需要内部try/finally块呢?

    清理。无论发生什么异常,最终都会执行

试试这个。看看它做了什么。

try: 
raise OSError("hi mom") 
finally: 
print "Hmmm" 
+0

感谢您打击我的问题的每一部分。很有帮助。 – 2008-12-17 16:36:59

0

使用最新版本的Python,您不需要嵌套try-except和try-finally。尝试 - 除了-终于已经统一:

try: 
    non_existing_var 
except: 
    print 'error' 
finally: 
    print 'finished' 
+0

谢谢,但我已经知道try/except/finally语法(我不知道他们曾经是分开的,实际上)。我的问题是如何测试file.read()失败,以确保except块在正确的(错误的?)条件下运行。 – 2008-12-17 15:22:47

0

谷歌搜索一点点得到这个Unified try/except/finally

希望它帮助;)

+0

谢谢,我是一个Python新手,我甚至不知道他们*在一次不统一。不过,我的问题实际上是关于如何测试file.read()错误。 – 2008-12-17 15:20:36

3

我不同意提及统一try/except/finally块的其他答案。这将改变行为,因为如果打开失败,你不希望finally块试图关闭文件。分割块在这里是正确的(尽管使用新的“with open(filename,'rU') as f”语法代替它可能会更好)。

read()可能会失败。例如,数据可能太大而不适合内存,或者用户可能用control-C发信号通知中断。这些情况不会被IOError捕获,而是由调用者处理(或不调用),调用者可能想根据应用程序的性质做不同的事情。然而,即使代码没有处理错误,代码仍然有义务清理文件,因此最终没有除外。

+0

谢谢。您在文件成功打开后读取失败的解释很有帮助。 – 2008-12-17 16:36:10