代码之家  ›  专栏  ›  技术社区  ›  Bill the Lizard

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

  •  4
  • Bill the Lizard  · 技术社区  · 17 年前

    我有以下代码(改编自 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-exclusive现在是统一的,所以添加一个,至少在语法上,不是问题。

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

    此外,如果我 do not 的常用口语形式 需要一个except块,那么我为什么需要内部try/finally块呢?

    3 回复  |  直到 13 年前
        1
  •  7
  •   twasbrillig    11 年前

    最后,我发现积木经常被过度使用。文件关闭(以及其他一些类似的模式)非常重要,Python 3.0将有一个 具有 声明只是以一种稍微不那么模糊的方式涵盖了这个基础。

    • 我需要一个带有finally的例外吗?

      这触及了这个具体例子的混乱本质,以及他们为什么添加 具有 声明。

      这个 最后 做“不管什么”的清理。例外或无例外 最后 总是被执行。

    • 在open()调用成功后,read()调用会失败吗?

      所有操作系统调用、所有I/O调用(几乎所有)都可能引发异常。打开后和阅读前都可能发生各种坏事。

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

      查阅文件。在打开和读取之间可能会出现许多愚蠢的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"
    
        2
  •  3
  •   Brian    17 年前

    我不同意其他提到统一try/except/finally块的答案。这将改变行为,因为如果打开失败,您不希望finally块尝试关闭文件。这里的分割块是正确的(尽管使用新的“ with open(filename,'rU') as f “改为语法)。

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

        3
  •  0
  •   Oli    17 年前

    使用最新版本的Python,除了try and try finally之外,您不需要嵌套try。try except finally已经统一:

    try:
      non_existing_var
    except:
      print 'error'
    finally:
      print 'finished'
    
        4
  •  0
  •   dario minonne    17 年前