python – 在上下文管理器中捕获异常__enter __()

栏目: Python · 发布时间: 5年前

内容简介:http://stackoverflow.com/questions/13074847/catching-exception-in-context-manager-enter

即使在__enter __()中有异常,也可以确保__exit __()方法被调用?

>>> class TstContx(object):
...    def __enter__(self):
...        raise Exception('Oops in __enter__')
...
...    def __exit__(self, e_typ, e_val, trcbak):
...        print "This isn't running"
... 
>>> with TstContx():
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __enter__
Exception: Oops in __enter__
>>>

编辑

这是尽可能接近我可以得到…

class TstContx(object):
    def __enter__(self):
        try:
            # __enter__ code
        except Exception as e
            self.init_exc = e

        return self

    def __exit__(self, e_typ, e_val, trcbak):
        if all((e_typ, e_val, trcbak)):
            raise e_typ, e_val, trcbak

        # __exit__ code


with TstContx() as tc:
    if hasattr(tc, 'init_exc'): raise tc.init_exc

    # code in context

在后视中,情景管理器可能不是最好的设计决策

喜欢这个:

import sys

class Context(object):
    def __enter__(self):
        try:
            raise Exception("Oops in __enter__")
        except:
            # Swallow exception if __exit__ returns a True value
            if self.__exit__(*sys.exc_info()):
                pass
            else:
                raise


    def __exit__(self, e_typ, e_val, trcbak):
        print "Now it's running"


with Context():
    pass

要让程序继续运行,而不执行上下文块,您需要检查上下文块中的上下文对象,并且只有在__enter__成功时才能执行重要的操作.

class Context(object):
    def __init__(self):
        self.enter_ok = True

    def __enter__(self):
        try:
            raise Exception("Oops in __enter__")
        except:
            if self.__exit__(*sys.exc_info()):
                self.enter_ok = False
            else:
                raise
        return self

    def __exit__(self, e_typ, e_val, trcbak):
        print "Now this runs twice"
        return True


with Context() as c:
    if c.enter_ok:
        print "Only runs if enter succeeded"

print "Execution continues"

据我所知,您无法完全跳过该块.并注意到这个上下文现在吞噬了它中的所有异常.如果您希望在__enter__成功时不要吞下异常,请在__exit__中检查self.enter_ok,如果为True,则返回False.

http://stackoverflow.com/questions/13074847/catching-exception-in-context-manager-enter


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

SEO实战密码

SEO实战密码

昝辉 / 电子工业出版社 / 2012-5-1 / 89.00元

SEO实战密码:60天网站流量提高20倍(第2版),ISBN:9787121167676,作者:昝辉Zac 著一起来看看 《SEO实战密码》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具