关于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发生异常时执行 无论有无发生异常都会执行

