返回介绍

处理异常

发布于 2019-08-08 13:05:11 字数 1812 浏览 861 评论 0 收藏 0

我们还没有谈到__exit__方法的这三个参数:type, valuetraceback
在第4步和第6步之间,如果发生异常,Python会将异常的type,valuetraceback传递给__exit__方法。
它让__exit__方法来决定如何关闭文件以及是否需要其他步骤。在我们的案例中,我们并没有注意它们。

那如果我们的文件对象抛出一个异常呢?万一我们尝试访问文件对象的一个不支持的方法。举个例子:

with File('demo.txt', 'w') as opened_file:
    opened_file.undefined_function('Hola!')

我们来列一下,当异常发生时,with语句会采取哪些步骤。

  1. 它把异常的type,valuetraceback传递给__exit__方法
  2. 它让__exit__方法来处理异常
  3. 如果__exit__返回的是True,那么这个异常就被优雅地处理了。
  4. 如果__exit__返回的是True以外的任何东西,那么这个异常将被with语句抛出。

在我们的案例中,__exit__方法返回的是None(如果没有return语句那么方法会返回None)。因此,with语句抛出了那个异常。

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
AttributeError: 'file' object has no attribute 'undefined_function'

我们尝试下在__exit__方法中处理异常:

class File(object):
    def __init__(self, file_name, method):
        self.file_obj = open(file_name, method)
    def __enter__(self):
        return self.file_obj
    def __exit__(self, type, value, traceback):
        print("Exception has been handled")
        self.file_obj.close()
        return True

with File('demo.txt', 'w') as opened_file:
    opened_file.undefined_function()

# Output: Exception has been handled

我们的__exit__方法返回了True,因此没有异常会被with语句抛出。

这还不是实现上下文管理器的唯一方式。还有一种方式,我们会在下一节中一起看看。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文