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