首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python try:except:finally

python try:except:finally
EN

Stack Overflow用户
提问于 2011-10-15 19:12:25
回答 8查看 99.9K关注 0票数 55
代码语言:javascript
复制
# 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()

上面的代码是从一个函数中摘录的。用户的某个系统报告了以下行中的错误:

代码语言:javascript
复制
file.write("Hello World!")

错误:

代码语言:javascript
复制
AttributeError: 'NoneType' object has no attribute 'write'

问题是,如果python无法打开给定的文件,则“except”块将执行,并且它必须返回,但控制权将转移到抛出给定错误的行。'file‘变量的值为'None’。

有什么建议吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-10-15 19:14:46

您不应该写入finally块中的文件,因为except块不会捕获那里引发的任何异常。

如果try块引发异常,则执行except块。无论发生什么,finally块都会执行。

此外,应该不需要将file变量初始化为none

except块中使用return不会跳过finally块。就其本质而言,它不能被跳过,这就是为什么你想把你的“清理”代码放在那里(即关闭文件)。

所以,如果你想使用try:except:finally,你应该这样做:

代码语言:javascript
复制
try:
    f = open("file", "w")
    try:
        f.write('Hello World!')
    finally:
        f.close()
except IOError:
    print 'oops!'

一种更简洁的方法是使用with语句:

代码语言:javascript
复制
try:
    with open("output", "w") as outfile:
        outfile.write('Hello World')
except IOError:
    print 'oops!'
票数 113
EN

Stack Overflow用户

发布于 2011-10-15 19:17:51

如果该文件未打开,则file = open(filePath, 'w')行将失败,因此不会为file分配任何内容。

然后,except子句运行,但文件中没有任何内容,因此file.close()失败。

finally子句始终运行,即使有异常也是如此。由于file仍然为None,因此您会得到另一个异常。

对于只有在没有异常的情况下才发生的事情,您需要一个else子句而不是finally子句。

代码语言:javascript
复制
    try:
        file = open(filePath, 'w')
    except IOError:
        msg = "Unable to create file on disk."
        return
    else:
        file.write("Hello World!")
        file.close()

为什么是elsePython docs说:

使用else子句比向try子句添加额外的代码更好,因为它可以避免意外地捕获不是由try保护的代码引发的异常...except语句。

换句话说,这不会从writeclose调用中捕获IOError。这很好,因为那样原因就不会是“无法在磁盘上创建文件”。-这将是一个不同的错误,一个你的代码没有准备好的错误。最好不要尝试处理这样的错误。

票数 35
EN

Stack Overflow用户

发布于 2011-10-15 19:19:22

这里面的逻辑是什么

file.write("Hello World!")

finally子句中??我认为它必须放在try子句本身中。

代码语言:javascript
复制
try:
        file = open(filePath, 'w')
        file.write("Hello World!")
except IOError:
        print("Unable to create file on disk.")
finally:
        file.close()
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7777456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档