美文网首页
with使用,预先处理与事后处理

with使用,预先处理与事后处理

作者: cctse | 来源:发表于2016-06-03 10:48 被阅读0次

with语句常用来处理一些事务的事先处理与事后清理工作。像文件处理时要先取得文件句柄,处理完后要关闭文件句柄

file = open('tes.txt')
data = file.read()
file.close()

这里没有对读取数据发生的异常作任何处理,而且容易忘记把文件close掉。下面代码添加异常处理

try:
    file = open('tes.txt')
except:
    print('fail to open')

try:
    data = file.read()
    # do something
except:
    print('read err')
    # do something
finally:
    file.close()

这段代码虽然运行良好,但是太冗长了。下面使用with优雅地实现文件操作

with open('tes.txt') as file:
    data = file.read()
    # do something

这里with会自动处理文件关闭操作。这里没有对打开文件异常作处理,数据读取异的处理是文件对象中定义的,因为是C写的模块,不知道实际处理情况。实际使用时候用try except外层处理一次应该就够了

自定义with处理对象

定义一个对象并实现enter()与exit()方法,分别进行预处理与后处理。enter()返回一个任意对象给as使用

class Tes:
    def __enter__(self):
        print('in enter')
        # raise ValueError('enter error')   # 这里的异常会直接退出,不会执行with block与__exit__()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('in exit')
        print(exc_type)
        print(exc_val)
        print(exc_tb)
        if exc_type is ValueError:
            return True  #返回ture时 with block的ValueError异常会被拦截, 程序会正常执行

    # 这个不是必需的
    def dosomething(self):
        print('do something')

with Tes() as t:
    t.dosomething()
    raise ValueError('block error')
  
## 运行结果  
# in enter
# do something
# in exit
# <class 'ValueError'>
# block error
# <traceback object at 0x102a255c8>

with多个对象

with open('1.txt') as f1, open('2.txt') as f2:
    # do something with f1, f2

相关文章

  • with使用,预先处理与事后处理

    with语句常用来处理一些事务的事先处理与事后清理工作。像文件处理时要先取得文件句柄,处理完后要关闭文件句柄 这里...

  • springboot 多数据源 health

    基于公司多库使用的框架,导致health接口报错,作词处理。主要实现方式,就是在做db健康监测的时候预先处理下ro...

  • Java异常处理机制

    什么是异常处理机制: 异常处理机制: 让程序发生异常时,按照代码预先设定的异常处理逻辑,针对性地处理异常,让程序尽...

  • 如何做好数据预处理(一)

    数据分析中,需要先挖掘数据,然后对数据进行处理。数据预处理的字面意思就是对于数据的预先处理,数据预处理的作用就是为...

  • 有点后悔

    晚上与别班的男生怼起来了。事后想想,没必要。应该不理会,冷处理。后悔。

  • 预先处理暴增的流量

    如果流量突然飙大,总有一个资源会遇到瓶颈。按照经验大概出问题地方是DB,磁盘io、CPU、带宽、连接数、内存其中的...

  • Java入门:异常

    Java异常 异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可...

  • 标准粘钢胶施工工艺流程

    使用方法与施工要点: 1、表面处理 表面处理是关键的工序,包括加固构件粘合面处理及钢板粘合面处理。 对于混凝土构件...

  • C语言:编译链接的流程

    编译链接的流程图 第一个过程:预处理预处理器对.c源程序进行一些预先处理,为后续编译打好基础预处理的内容(这些内容...

  • Android 中的异常处理

    异常发生时,如果没有一个异常处理器来处理这个异常,程序会被中止。在 JVM 当中有一个预先定义好的异常处理层次结构...

网友评论

      本文标题:with使用,预先处理与事后处理

      本文链接:https://www.haomeiwen.com/subject/wmnhrttx.html