python错误和异常(1)

1  SyntaxError: Python解释器语法错误,是唯一不是在运行时发生的异常。

 

2 检测和处理异常

try语句有两种主要形式:try-except 和 try-finally. 只能二选一。

一个try语句可以对应一个或多个except子句,但只能对应一个finally子句。

try语句块中异常发生点后的剩余语句永远不会到达。

except后面相当于一个处理器,处理异常发生时应该怎么做。


异常或错误的处理流程:当一个异常被引发,剩余代码将会忽略,解释器搜索处理器,如果没有合适的处理器,那么异常就向上移交给调用者去处理,这意味着堆栈框架立即回到之前的那个,如果在上层调用者也没有找到对应的处理器,该异常会继续被向上提交,直到找到合适的处理器,如果到达最顶层仍然没有找到对应处理器,那么就认为这个异常是未处理的,python解释器会显示出跟踪返回消息,然后退出。


try-except语句可以连贯使用,这样可以处理多种异常。

def safe_float(obj):
    try:
        retval = float(obj)
    except ValueError:
        retval = 'could not convert non-number to float'
    except TypeError:
        retval = 'object type cannot be converted to float'
    return retval

这样,safe_float()函数就可以分别处理ValueError和TypeError两种异常了。


python2.5以后,对于keyboardInterrupt和SystemExit两个异常(not real error),从Exception里移出,和Exception平级,这样当使用如下的catch_all代码时,就不比为这两个异常创建额外的处理器。

try:
    ....
except Exception, e:
    #handle real errors

异常参数:异常引发后,它会被传递给异常处理器,作为附加帮助信息,一般包含一个指示错误原因的字符串元组。



finally子句:finally子句是无论异常是否发生,是否捕捉都会执行的一段代码。

try:
    A
except MyException:
    B
else:
    C
finally:
    D

上面这段代码有两种可能的执行顺序:

  • 正常:A-C-D
  • 异常:A-B-D

try-finally语句:这个语句不是用来捕获异常的。当try的语句块中有异常发生时,会立即跳转到finally语句段,当finally中的所有代码都执行完毕后,会继续向上一层引发异常。

try语句的嵌套:

ccfile = None
try:
    tyr:
        ccfile = open('cardata.txt', 'r')
        txns = ccfile.readlines()
    except IOError:
        log.write('no txns this month\n')
finally:
    if ccfile:
        ccfile.close()
这样写的好处是,当readlines调用失败时,异常处理会去继续执行except中的子句,并且在finally子句中会去尝试关闭文件。


一个需要注意的地方是:如果finally中的代码引发了另一个异常或由于return, break, continue语法而终止,原来的异常将会丢失而无法重新引发。


后面会接着讲到 with语句等。

posted @ 2013-08-29 19:47  suzhou  阅读(446)  评论(0编辑  收藏  举报