NameError             尝试访问一个未申明的变量

ZeroDivisionError     除数为零

SyntaxError           解释器语法错误

IndexError            请求的索引超出序列范围

KeyError               请求一个不存在的字典关键字

IOError                 输入/输出错误

AttributeError        尝试访问未知的对象属性


异常可以通过try语句来检测。任何在try语句块里的代码都会被监测,检查有无异常发生。


try语句有两种主要形式:try-except和try-finally。这两个语句是互斥的,也就是说你只能使用其中的一种。一个try语句可以对应一个或多个except子句,但只能对应一个finally子句,或是一个try-except-finally复合语句。


你可以使用try-except语句检测和处理异常。你也可以添加一个可选的else子句处理没有探测到异常的执行的代码。而try-finally只允许检测异常并做一些必要的清除工作,没有任何异常处理设施。


try:

    try_suite

except Exception[,reason]:

    except_suite


try语句块中异常发生点后的剩余语句永远不会到达,所以也永远不会执行。处理流程:忽略代码,继续执行和向上移交。


可以把多个except语句连接在一起,处理一个try块中可能发生的多种异常。


try:

    try_suite

except Exception1[,reason]:

    except_suite1

except Exception2[,reason]:

    except_suite2


也可以在一个except子句里处理多个异常。except语句在处理多个异常时要求异常被放在一个元组里:


try:

    try_suite

except (Exception1,Exception2)[,reason]:

    except_suite1_and_suite2


如果要捕获所有的异常呢?


第一种:Exception是在最顶层的。

try:

    :

except Exception,e:

    #error occurred,log 'e',etc.


第二种:不推荐

try:

    :

except:

    #error occurred,etc.


BaseException下面分别有三大类异常:KeyboardInterrupt、SystemExit和Exception。所有当前内建异常都放在Exception下。


底线:避免把大片的代码装入try-except中然后使用pass忽略掉错误。


一般来说,异常的名字已经是一个满意的线索了,但这个错误字符串会提供更多的信息。


__class__属性存在于所有的类实例中,而__doc__类属性存在于所有的定义了文档字符串的类中。


采用字符串化的异常参数来替换单一的错误信息:

def safe_float(object):

    try:

        retval=float(object)

    except (ValueError,TypeError),diag:

        retval=str(diag)

    return retval


在try范围中没有异常被检测到时,执行else子句。


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


try:

    A

except MyException:

    B

else:

    C

finally:

    D


无论如何,你都可以有不止一个的except子句,但最少有一个except语句,而else和finally都是可选的。


另一种finally的使用方式是finally单独和try连用。


如果finally中的代码引发了另一个异常或由于return、break、continue语法而终止,原来的异常将丢失而且无法重新引发。


with语句是用来简化代码的。


try-except和try-finally的一种特定的配合用法是保证共享的资源的唯一分配,并在任务结束的时候释放它。


with语句的目的在于从流程图把try、except和finally关键字和资源分配释放相关代码统统去掉,而不像try-except-finally那样仅仅简化代码使之易用。

with context_expr [as var]:

    with_suite


上下文管理器主要作用于共享资源。


python提供了一种机制让程序员明确的触发异常,这就是raise语句。


不含参数的raise语句结构会引发当前代码块最近触发的一个异常。如果之前没有异常触发,会因为没可以有重新触发额异常而生成一个TypeError异常。


断言是一句必须等价于布尔真的判定,发生异常也就意味着表达式为假。


断言可以简简单单的想象为raise-if语句。测试一个表达式,如果返回值为假,就触发异常。


assert expression[,arguments]


另一种获取异常信息的途径是通过sys模块中exc_info()函数。


#通过引发的异常信息,能够快速定位到问题并调试,找出处理错误的办法。

try:

filename=raw_input('Enter file name:')

fobj=open(filename,'r')

for eachLine in fobj:

print eachLine,

fobj.close()

except IOError,e:

print'file open error:',e

也可以通过raise语句故意引发一个异常。