1 、异常
例如:
def
fetcher(obj,index):
return
obj[index]
def
catcher():
try :
fetcher(x, 4 )
except
IndexError:
print ( ‘got exception‘ )
print ( ‘continuing‘ )
2 、引发异常
raise
IndexError
3 、用户定义的异常: 用户定义的异常继承自内置异常类Exception
class
Bad(Exception):
pass
4 、 try / finally
如果 try 部分没有发生异常,则 finally 中部分会执行, finally 后面也会执行。如果 try 部分发生异常,则在 finally 中的部分会执行, finally 后面部分不执行。
5 、 try / except / else 语句
try :
statement
except
name1:
statements
except
(name2,name3):
statements
except
name4 as data:
statements
except
:
statements
else : #没有发生异常时,执行这部分
statements
解释
except : #捕获所有异常
except
name: 捕获特定异常
except
name,value: 捕获所列异常和额外的数据
except
(name1,name2): 捕获列出的异常
except
(name1,name2) value: 捕获列出的异常,并取得额外的数据
else : 如果没有发生异常,就运行
finally : 总是会运行此代码
Exception的异常几乎与一个空的 except 具有相同的效果,但是忽略和系统退出相关的异常:
try :
ation()
except
Exception:
...
6 、统一 try / except / finally 语句
try :
main - action
except
Exception1:
handler1
except
Exception2:
handler2
else :
else - block
finally :
finally - block
无论发生什么,当main - action代码完成时,而任何引发的异常都已处理后, finally - block就会被执行。事实上,即使异常处理器或者 else - block内部有错误发生而引发的新的异常, finally - block内部代码依然会执行
就像往常一样, finally 字句并没有终止异常,当 finally - block执行时,如果异常还在,就会在 finally - block代码执行后继续传递。而控制权会跳至程序其他地方(到另外一个 try ,或者默认顶层处理器)如果 finally 执行时,没有异常处于激活状态,控制权就会在整个 try 语句之后继续执行。
7 、 raise 语句
raise
<instance> #抛出一个类的实例
raise
< class > #产生一个类的实例并抛出
raise
#重新抛出最近最常用的异常
例如:
raise
IndexError #class (instance create)
raise
IndexError #instance(create in statement)
如果一个 try 包含了一个名为 except
name as X:字句,变量x将会分配给引发中提供的实例:
try
:
...
except
IndexError as X: #x被赋予成IndexError的实例
...
利用 raise 传递异常
raise 语句不包括异常名称或额外数据值时,就是重新引发当前异常。如果需要捕捉异常和处理一个异常,又不希望异常在程序中死掉时,一般就会使用这种形式。
例如:
try :
raise
IndexError( ‘spam‘ )
except
IndexError:
print ( ‘propagating‘ )
raise
通过这种方式执行 raise 时,会重新引发异常,并将其传递给更高层的处理器(或者顶层的默认处理器,他会停止程序,打印标准错误消息) 。
8 、python3. 0 异常链: raise
from
raise
exception from
otherexception
当使用 from 的时候,第二个表达式指定了另一个异常类或实例,他会附加到引发异常的__cause__属性。如果引发的异常没有捕获,python把异常也作为标准出错信息的一部分打印出来。
9 、 assert 语句
assert
<test>,<data>
1 、 assert 语句用来声明某个条件是真的。
2 、如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么 assert 语句是应用在这种情形下的理想语句。
3 、当 assert 语句失败的时候,会引发一AssertionError。
10 、with / as环境管理器
在python2. 6 和python3. 0 中引入了一种新的异常相关的语句
如果想在python2. 5 中使用的话,必须使用如下语句来激活
from
__future__ import
with_statement
基本使用
with expression [as varible]:
with - block
11 、环境管理协议
1 、计算表达式,所得到的对象称为环境管理器,它必须有__enter__和 __exit__方法
2 、环境管理器的__enter__方法会被调用,如果as字句存在,其返回值会赋值给as子句中的变量,否则抛弃。
3 、代码嵌套代码会执行
4 、如果with代码块引发异常,__exit__( type ,value,traceback)方法会被调用.这些也是由sys.exc_info返回相同的值。否则 异常会终止。正常情况下异常应该重新引发,这样的话才能传递到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_tb):
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( ‘test 2‘ )
raise
TypeError
print ( ‘not reached‘ )
12 、内置Exception类
BaseException 异常的顶级根类。这个类不能当作用户定义的类直接继承(使用Exception)。它提供了子类所继承的默认的打印和状态保持行为。如果在这个类的一个实例上调用 str 内置函数时,该类返回创建实例的时候所传递的构造函数的显示字符串(如果没有参数的话,返回一个空字符串),此外除非子类替换了这个类的构造函数,在实例构造时候传递给这个类的所有参数都将作为一个元组存储在args属性中
Exception 与应用相关的异常的顶层超类。这是BaseException的一个直接子类,并且是所有其他内置异常类的超类,除了系统退出实践之类(SystemExit.KeyboardInterrupt和GenatorExit)。几乎所有用户定义的类都应该继承自这个类,而不是BaseException。当遵循这个惯例的时候,在一条 try 预计的处理器中指名Exception,确保你的程序将捕获出系统退出事件之外的所有异常,通常该事件是允许通过的。实际上,Exception变成了 try 预计中的一个全捕获,并且比一条空的Except更精确。
ArithmeticError 所有数值错误的超类(并且是Exception的一个子类)
OverflowError 识别特定数值错误的子类
|