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?
答案 0 :(得分:2)
您的第一个异常处理程序尝试通过连接另一个字符串和int
(e.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')
使代码更安全/更标准的一些方面:
with
块是一种更标准,更易读的文件处理方式。