当前位置: > python教程 > python高级教程 >

python自定义with语句
栏目分类:python高级教程   发布日期:2019年03月15日 17:09:28   浏览次数:

        上一篇文章中介绍了with语句的语法本质,和一些内置对象的with语句用法的常用解析,接下来将介绍如何自定义一个with语句。

                                                  

1.案例
定义一个with语句,可以处理with语句中的ZeroDivisionError异常,除此之外的异常不会被捕获。代码如下:

class catch_zero:

    def __init__(self, log=True): # log参数指定是否打印具体信息
        self.log = log

    def __enter__(self):   # with语句开始执行的地方,如果log参数为True,则打印消息
        if self.log:
            print('catch diverror...')

    def __exit__(self, exc_type, exc_val, exc_tb): # with语句块结束后必然执行的语句
        if issubclass(exc_type, ZeroDivisionError): # 如果是异常的类型是ZeroDivisonError异常,则捕获
            if self.log:                            # 根据log参数决定是否打印处置的信息
                print(exc_val)
                print('catched')   
            return True                           # 返回True,指示说明异常已近被处理,不会向上蔓延异常
                                 # 如果返回False或者None,说明异常没有被处理,会继续抛出直到被处理完毕
                                             
if __name__ == '__main__':
    with catch_zero(log=True):
        x = 18 / 0
    print('done')
结果如下:
'''
catch diverror...
division by zero
catched
done
'''
可以看到ZeroDivisionError异常被with语句捕获,并没有终止程序的运行,但是with语句出现了其他异常任然会向上冒泡。

结语
        with语句后面所需对象需要实现__enter__和__exit__方法。__exit__方法的参数分别是异常的类,异常的值和traceback对象。如果没有出项异常,则这些参数为None值。__exit__方法返回True值,指示异常已被处理,异常不会向上冒泡,返回False或None,则表明异常未被处理,异常会向上冒泡。虽然自定义的with语句很方便,但是需要定义一个类来实现,并不能一个函数的方式方便的实现同样的功能,因此需要其他的方法是一个函数的形式使用with语句。


相关热词:

热门关键词
python字符串
     
python教程 python爬虫 python人工智能 Python+大数据 python问答