如何在Python中测试file.read()错误?

Bil*_*ard 4 python error-handling file-io

我有以下代码(改编自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."
Run Code Online (Sandbox Code Playgroud)

关于这段代码困扰我的是没有except块的内部try/finally块.我需要一个除了块吗?呼叫成功read()后呼叫是否会失败open()?我知道try-except-finally现在是统一的,所以添加一个,至少在语法上,不是问题.

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

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

S.L*_*ott 7

我发现最后块经常被过度使用.文件关闭(以及一些其他类似的模式)非常重要,以至于Python 3.0将使用with语句来覆盖这个基础,而不是那么模糊.

  • 我最后需要一个除外吗?

    这取决于这个具体例子的混乱性质,以及为什么他们添加了with语句.

    最后做"不管是什么"的清理工作.异常或无异常,最终总是执行.

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

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

  • 如果我添加一个except块,它将在什么条件下执行?

    阅读文件.打开和读取之间可能会发生许多愚蠢的I/O错误.另外,请阅读内置异常. https://docs.python.org/2/library/exceptions.html

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

    你需要一个模拟文件对象.这个对象会响应,open但会引发一个IOErrorOSError每个read.

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

    清理.该最终将不管是什么引发异常执行.

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

try:
 raise OSError("hi mom")
finally:
 print "Hmmm"
Run Code Online (Sandbox Code Playgroud)