使用 Python 'with' 语句时捕获异常

新手上路,请多包涵

我不知道如何处理 python ‘with’ 语句的异常。如果我有代码:

 with open("a.txt") as f:
    print f.readlines()

我真的很想处理“文件未找到异常”以做某事。但我不会写

with open("a.txt") as f:
    print f.readlines()
except:
    print 'oops'

不能写

with open("a.txt") as f:
    print f.readlines()
else:
    print 'oops'

在 try/except 语句中包含 with 也不起作用,并且不会引发异常。我该怎么做才能以 Pythonic 方式处理 with 语句中的失败?

原文由 grigoryvp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 540
2 个回答
from __future__ import with_statement

try:
    with open( "a.txt" ) as f :
        print f.readlines()
except EnvironmentError: # parent of IOError, OSError *and* WindowsError where available
    print 'oops'

如果你想对来自公开调用的错误和工作代码的错误进行不同的处理,你可以这样做:

 try:
    f = open('foo.txt')
except IOError:
    print('error')
else:
    with f:
        print f.readlines()

原文由 Douglas Leeder 发布,翻译遵循 CC BY-SA 2.5 许可协议

执行此操作的最佳“Pythonic”方式是利用 with 语句,列为 PEP 343 中的示例 #6,它给出了该语句的背景。

 @contextmanager
def opened_w_error(filename, mode="r"):
    try:
        f = open(filename, mode)
    except IOError, err:
        yield None, err
    else:
        try:
            yield f, None
        finally:
            f.close()

用法如下:

 with opened_w_error("/etc/passwd", "a") as (f, err):
    if err:
        print "IOError:", err
    else:
        f.write("guido::0:0::/:/bin/sh\n")

原文由 user765144 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题