首页 > 代码库 > python 异常知识点

python 异常知识点

raise from

python 在3.0 之后引入了raise from 表达式:

raise exception from otherexception

当使用该语法时,第二个表达式指定了另一个异常类或实例,它会附加到引发异常的__cause__属性

注意:

python3.0不再支持raise Exc,Args形式,而该形式在Python2.6中仍然可用,在Python3.0中,使用 raise Exc(Args)调用。

with  as

with语句格式:

with expression [as variable]:    with-block

variable是expression执行后返回的对象引用。

with as 作用是先执行启动程序,然后执行代码块,执行终止程序代码,无论该代码块是否引发异常。

例如:

myfile  =  open(rC:\misc\data)try:    for line in myfile:          print(line)finally:      myfile.close

可以使用:

with open(rC;\misc\data) as myfile:     for line in myfile:           print(line)

自定义环境管理协议

就是自定义可以接入with语句的对象。

with语句实际工作方式:

1、计算表达式,所得到的对象称为环境管理器,它必须有__enter__和__exit__方法。

2、环境管理器的__enter方法被调用,如果as语句存在,则返回值会被赋值给as子句中的变量

3、代码块中嵌套代码会被执行。

4、如果with引发异常,__exit__(type, value, traceback)方法会被调用,如果此方法返回值为假,则异常会被重新触发,否则,异常会被终止。正常情况下,应该重新触发异常,这样的话才能传递到with语句之外。

5、如果with代码块没有引发异常,__exit__方法依然会被调用,其type、value、traceback都会以None传递。

例:

class TraceBlock:    def message(self, arg):        print(running,arg)        def __enter__(self):        print(starting with block)        return self        def __exit__(self, exc_type, exc_value, exc_th):        if exc_type is None:            print(exited normally\n)        else:            print(raise an exception!, exc_type)            return False        with TraceBlock() as action:    action.message(test 1)    print(reached)    with TraceBlock() as action:    action.message(test2)    raise TypeError    print(not reached)

执行结果:

starting with block(running, test 1)reachedexited normallystarting with block(ruTraceback (most recent call last):  File "D:\workspace\aptana\pythonTest\test\com\cy\cyg\TraceBlock.py", line 27, in <module>    raise TypeErrorTypeErrornning, test2)(raise an exception!, <type exceptions.TypeError>)