关于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值