# Open new file to write
file = None
try:
file = open(filePath, 'w')
except IOError:
msg = ("Unable to create file on disk.")
file.close()
return
finally:
file.write("Hello World!")
file.close()上面的代码是从一个函数中摘录的。用户的某个系统报告了以下行中的错误:
file.write("Hello World!")错误:
AttributeError: 'NoneType' object has no attribute 'write'问题是,如果python无法打开给定的文件,则“except”块将执行,并且它必须返回,但控制权将转移到抛出给定错误的行。'file‘变量的值为'None’。
有什么建议吗?
发布于 2011-10-15 19:14:46
您不应该写入finally块中的文件,因为except块不会捕获那里引发的任何异常。
如果try块引发异常,则执行except块。无论发生什么,finally块都会执行。
此外,应该不需要将file变量初始化为none。
在except块中使用return不会跳过finally块。就其本质而言,它不能被跳过,这就是为什么你想把你的“清理”代码放在那里(即关闭文件)。
所以,如果你想使用try:except:finally,你应该这样做:
try:
f = open("file", "w")
try:
f.write('Hello World!')
finally:
f.close()
except IOError:
print 'oops!'一种更简洁的方法是使用with语句:
try:
with open("output", "w") as outfile:
outfile.write('Hello World')
except IOError:
print 'oops!'发布于 2011-10-15 19:17:51
如果该文件未打开,则file = open(filePath, 'w')行将失败,因此不会为file分配任何内容。
然后,except子句运行,但文件中没有任何内容,因此file.close()失败。
finally子句始终运行,即使有异常也是如此。由于file仍然为None,因此您会得到另一个异常。
对于只有在没有异常的情况下才发生的事情,您需要一个else子句而不是finally子句。
try:
file = open(filePath, 'w')
except IOError:
msg = "Unable to create file on disk."
return
else:
file.write("Hello World!")
file.close()为什么是else?Python docs说:
使用else子句比向try子句添加额外的代码更好,因为它可以避免意外地捕获不是由try保护的代码引发的异常...except语句。
换句话说,这不会从write或close调用中捕获IOError。这很好,因为那样原因就不会是“无法在磁盘上创建文件”。-这将是一个不同的错误,一个你的代码没有准备好的错误。最好不要尝试处理这样的错误。
发布于 2011-10-15 19:19:22
这里面的逻辑是什么
file.write("Hello World!")
在finally子句中??我认为它必须放在try子句本身中。
try:
file = open(filePath, 'w')
file.write("Hello World!")
except IOError:
print("Unable to create file on disk.")
finally:
file.close()https://stackoverflow.com/questions/7777456
复制相似问题