0

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

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

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

在下面的代码中,在函数 write_to_disk() 中,我看到了第二次打印,执行直接跳转到调用函数 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?
4

2 回答 2

2

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

于 2013-10-11T14:00:04.827 回答
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 了解更多。
于 2013-10-11T14:20:58.633 回答