1.try:
command
except 错误类型,记录错误信息变量:
command
finally:
command
try...finally的用处是无论是否发生异常都要确保资源释放代码的执行。一般来说,如果没有发生错误,执行过try语句块之后执行finally语句块,完成整个流程。如果try语句块发生了异常,抛出了这个异常,此时就马上进入finally语句块进行资源释放处理。如下从几个细节讨论finally的特性。
1)、try中的return: 当在try语句块中含有return语句时,执行到return并不会直接返回,而是由Python忠实的再去执行finally语句块之后再执行return。(by gashero)从这里可以看出,只要程序没有突然终止,则finally中的资源释放语句一定会执行。无论发生什么异常都会执行到finally语句块中的代码。
2)、finally之后呢? 实际测试看来,finally之后,try语句块中抛出的异常并没有被处理,而是直接被抛出到try...finally语句块之外了。并且是在finally语句块执行之后继续抛出这个异常的。 所以为了更好的处理这个异常,可以使用两层嵌套try语句块。内层的try语句块使用try...finally形式,确保资源释放代码的执行。外层try语句块使用try...except形式,可以很好的识别异常形式,并且分别处理。
3)、如果希望直接finally掉呢? 有些时候在处理了finally中的资源释放之后就不再需要继续处理抛出的异常了,在这种情况下可以考虑在finally语句块中使用return语句。这样在资源释放之后直接返回,try语句块抛出的错误就不会继续向外抛出了。(by gashero)也就是节省了上面一条的外层try...except语句块了。当然,这样的后果是根本就不知道抛出过什么异常。
最后谈一条except子句需要注意的事情,就是多个except子句截获异常时,如果各个异常类之间具有继承关系,则子类应该写在前面,否则父类将会直接截获子类异常。放在后面的子类异常也就不会执行到了
2.raise 抛出异常
raise 异常类型(异常信息)