python 对异常的处理(try...finally...和with 方法)- 千月的python linux 系统管理指南学习笔记(15)

try...finally... 结构
我们在执行一长串关联命令时,会有一个问题,如果当中一个命令失败了,整个命令串事实上就没有必要执行下去了。在异常发生时,我们也需要执行一些收场工作。比如 close() 方法关闭文件。这时 try...finally... 结构就可以派上用场了。 这种结构简单的说是在 try 下的全部操作如果某项失败的话就终止并执行 finally 下定义的语句。如果全部操作都没有报错,那么最后也执行 finally 下定义的语句

编写的时候注意缩进, python是很注意格式的。 第4行报错了,但是第5行并没有执行,文件也正确关闭写入了。 再看看没有这个结构会有什么结果。
没有输出,因为没有 close() 方法关闭文件。

with 语句
我们上面的 try...finally... 虽然好用,但是代码段有点长。因此python2.5以后引入 with 语句。
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
我们是运维,其实可以不用去深究网上解释with时的上下文等概念,虽然弄懂也挺好,但是有时会给自己弄晕而失去兴趣。
下面是 with 的简单运用。

这是和上面 try...finally... 实现一样的功能。可以看到代码精简很多。

with 的实现离不开两个方法
__enter__():在使用with语句时调用,在代码块开始前调用,返回值与as后的参数绑定
__exit__():会话管理器在代码块执行完成好后调用,在with语句完成时,对象销毁之前调用
说简单点就是 with 语句在使用时会调用 对象的__enter__()和 __exit__()方法。

看到输出的结果其实很明显了,系统先执行了 init 方法,其实不使用 with ,init 方法依然会被调用。之后with语句将 test 类的__exit__方法存起来,然后调用 test 类的__enter__方法。__enter__方法打开文件并返回给with语句,打开的文件句柄被传递给后面 with 语句 as 后的 outfile 参数。最后调用之前暂存的__exit__方法关闭了文件。
所以我们在定义一个类的时候,如果希望使用 with 方法处理异常,那么就需要在类中定义__enter__和__exit__方法。

python 对异常的处理可以钻研的很深,但是作为运维来讲,没必要钻研的太厉害。比如 exit 后面的4个参数各代表什么。有精力可以了解下吧,没有的话,就当固定格式打上吧。


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值