pythonwith抛出异常是什么原理

    技术2022-07-10  207

    今天做多GPU处理手写数字识别的时候对with方法记得不是很清楚了

    平常用的时候仅仅知道with相当于try…expect 抛出异常的作用

    对于with来说,其底层的实现原理记忆的并不是很清晰


    于是我自己做了一个小代码进行测试,以下就是我定义的代码

    ######################################################################## class A: #---------------------------------------------------------------------- def __init__(self): self.a = 0 #---------------------------------------------------------------------- def __enter__(self): print("in enter") #---------------------------------------------------------------------- def __exit__(self, exc_type, exc_val, exc_tb): print("3 is not div 0") print("in exit") if __name__ == "__main__": a = A() with a : print("I'm here") print(3/0) print("helel")

    不难发现,在执行with中的程序的时候会出现除0报错的问题

    但是with的整个流程是什么样的呢?

    我们看看运行的结果:

    控制台的窗口打印的信息是: 从打印的流程中,我们不难看出

    首先当程序运行到with的时候

    会进入def __enter__(self):的方法中

    其次会运行with方法中的程序,比如上面的I'm here

    但是当运行到 3/0的时候,会发现出现异常了

    会直接进入到__exit__的方法中,打印exit中的内容

    最后抛出异常


    我们再次假设,如果with中没有异常,还会执行__exit__的方法么? 答案:是的

    我们稍微更改一下代码

    class A: #---------------------------------------------------------------------- def __init__(self): """Constructor""" self.a = 0 #---------------------------------------------------------------------- def __enter__(self): print("in enter") #---------------------------------------------------------------------- def __exit__(self, exc_type, exc_val, exc_tb): print("3 is not div 0") print("in exit") if __name__ == "__main__": a = A() with a : print("I'm here") print("3/0") print("helel")

    我们将3/0的代码变成了字符串,这样就不会报错了

    打印的结果如下所示:

    in enter I'm here 3/0 3 is not div 0 in exit helel

    通过打印的结果,我们可以得出一个结论就是:

    with在执行的过程中,在with中的代码,不论是否报错都将会执行__enter__和__exit__函数

    但是,当执行到问题程序的时候,会直接进入到__exit__函数中退出。

    猜想基于以上的问题,我们似乎可以把with方法看做是一个线程锁。

    Processed: 0.090, SQL: 9