python文件i / O中的异常处理

时间:2013-10-11 13:45:20

标签: python

Python新手在这里,我的代码中遇到了一些奇怪的行为。

我正在尝试将一些数据写入文件。在调用下面的代码块之前,我将数据的长度打印为大约50k。数据是我通过互联网获得的pdf文件。它是一个有效的pdf。

当我调用下面描述的函数F()时,我得到了在函数F中打印的异常消息,而不是在它失败的实际位置。

在下面的代码中,在函数write_to_disk()中,我看到第二个print,执行直接跳转到调用函数F()中的异常处理程序。我无法弄清楚为什么会这样。在磁盘上,我看到文件已创建但大小为0.

有些人可以看看下面的代码,可能会猜到可能会发生什么? 如果我在write_to_disk()函数中捕获异常,它怎么可能完全跳出函数?

编辑:感谢kobejohn,结果是excetion对象没有errno变量。摆脱它使打印出现。但更大的问题仍然存在。我看到失败,无法找出失败的原因。如何在此处收到错误消息?

def write_to_disk(self, pathToWrite, pdfFileData):
    try:
        print 'Here `1.1'
        fd = open(pathToWrite, "w+")
        print 'Here `2.1'
        fd.write(pdfFileData)
        print 'Here 3.1'
        fd.close()
    except Exception as e:
        print 'file cannot be opened ' + pathToWrite + e.errno  

这个函数由另一个函数F调用,就像这样 -

def F(self, url):

    pathWrite = get_path_to_use()
    pdfData = get_pdf_data(url)

    try:
        writetodisk(pathToWrite, pdfData)
    except Exception as e:
        print 'Did I jump directly to here?' + e.errno

这是程序的输出。我认为它不会添加任何东西,因为如果有任何用途我什么都看不到。事实上,即使在pdb中运行它,我也会获得相同的输出。

Here `1.1
Here `2.1
Did I jump directly to here?

2 个答案:

答案 0 :(得分:2)

您的第一个异常处理程序尝试通过连接另一个字符串和inte.errno)来构建字符串,这导致它(print语句)自己抛出异常(这是然后被外部异常处理程序捕获。)

答案 1 :(得分:1)

正如我们在评论中提到的那样,这只是冒泡而亚历山大说。使用此代码查看它是如何工作的(没有错误,但这只是一个令人讨厌的例外情况)。

def f(url):
    path_to_write = 'test.dat'
    pdf_data = 'asdf'
    try:
        write_to_disk(path_to_write, pdf_data)
    except Exception as e:
        print 'Did I jump directly to here?\n' + str(e)


def write_to_disk(path_to_write, pdf_data):
    try:
        print 'Here `1.1'
        with open(path_to_write, "w+") as fd:
            print 'Here `2.1'
            fd.write(pdf_data)
    except Exception as e:
        print 'file cannot be opened ' + path_to_write


f('fake_url')

使代码更安全/更标准的一些方面:

  • 在try块内做尽可能少的事情。尝试隔离您担心可能引发错误的代码
  • except块的相同规则。不要做任何奇怪的事。
  • 正如其他人提到的那样,使用with块是一种更标准,更易读的文件处理方式。
  • 使用函数和变量名称的其他小事,你可以看到我在上面的代码中改变了什么。谷歌PEP 8更多。