关于python with的用法及异常处理

关于python with的用法及异常处理

在网上看到一些人博客使用 with 用于异常处理,但是我在网仔细查阅,发现 该关键字不是用于处理异常的。

实际上

实际上,在with后面的代码块抛出异常时,exit()方法被执行。开发库时,清理资源,关闭文件等操作,都可以放在exit()方法中。 总之,with-as表达式极大的简化了每次写finally的工作,这对代码的优雅性是有极大帮助的。 如果有多项,可以这样写:

With open(1.txt) as f1, open(2.txt) as  f2:
    do something
说道with 就不得不说道 __enter__ 和 __exit__

简单来说 __enter__ 是在with 调用时执行(就如__init__ 优先执行) 而__exit__ (有点类似于__del__ 后执行销毁操作) 当然你可以自定义 因为套路过于固定,不是很适合由于异常处理。

如果没有with语句,则可能会写以下内容: 如果不用with语句,代码如下:

file = open("/tmp/foo.txt")
data = file.read()
file.close()

这里有两个烦人的事情。首先,您最终忘记关闭文件处理程序。第二个是如何处理一旦获得文件处理程序可能发生的异常。可以这样写来解决这个问题: 这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是处理异常的加强版本:

file = open("/tmp/foo.txt")
try:
    data = file.read()
finally:
    file.close()

虽然这很好用,但它不必要地冗长。这是with有用的地方。除了更好的语法外,关于它的好处是,它是非常好的处理异常的方法。当与以下代码一起使用时,上面的代码将如下所示: 有时就是使用一展身手的时候了。除了有更优雅的语法,用还可以很好的处理周围环境产生的异常。下面是用版本的代码:

with open("/tmp /foo.txt") as file:
    data = file.read()

with_example01.py

class Sample:
    def __enter__(self):
        print "In __enter__()"
        return "Foo"
 
    def __exit__(self, type, value, trace):
        print "In __exit__()"
 
            
def get_sample():
    return Sample()
 
 
with get_sample() as sample:
    print "sample:", sample

执行后,将导致:

bash-3.2$ ./with_example01.py
In __enter__()
sample: Foo
In __exit__()

如您所见,执行__enter __()函数返回的值-在这种情况下,将“ Foo”分配给sample执行该块的主体,从而打印出sample的值。“ Foo”调用__exit __()函数。真正强大的功能在于它可以处理异常。您可能已经注意到Sample的__exit __()函数带有三个参数-val,type和trace。这些在异常处理中很有用。让我们通过修改上面的示例来了解其工作原理。

如果要使用捕获异常可以使用:

try:
    print("执行11")
    num#未下定义变量
    print("执行22")
except:
    print("try发生异常时执行")
finally:
    print("无论有无发生异常都会执行")

输出结果: >>>runfile(‘E:/pythonnew/test.py’, wdir=‘E:/pythonnew’) 执行11 try发生异常时执行 无论有无发生异常都会执行

总结

开发库时,清理资源关闭文件等操作,都可以放在exit()方法中。
比较详细处理异常时没使用 try except finally
经验分享 程序员 微信小程序 职场和发展