异常抛出机制:为程序开发人员提供一种在运行错误发现,进行恢复处理,然后继续执行的能力。

范例:

>>> try:...     f =  open('unfile.py','r')... except IOError, e:...     print False, str(e)... False [Errno 2] No such file or directory: 'unfile.py'

#!/usr/bin/pythontry:                                            #try尝试执行代码    open('abc.log')except IOError,msg:                             #except接受异常,注意异常的名称要相符,通过变量接受异常信息    pass                                        #占位

#执行代码时没有任何问题,但这个代码是打不开的。

                  *msg变量解释,只是接受错误的信息:

        ....        except IOError,msg:    print msg        执行后代码后,打印相关错误        [Errno 2] No such file or directory: 'abc.log'

#如果直接执行:

open('abc.log')#报错:Traceback (most recent call last):  File "try.py", line 6, in 
    open('abc.log')IOError: [Errno 2] No such file or directory: 'abc.log'

异常类型注意:异常类型,并不是直接使用except就可以捕获异常;

[root@zabbix 123]# cat try.py #!/usr/bin/pythontry:    open('abc.log')except NameError,msg:                                #当修改异常类型为NameError    pass[root@zabbix 123]# python try.py Traceback (most recent call last):  File "try.py", line 3, in 
    open('abc.log')IOError: [Errno 2] No such file or directory: 'abc.log'

#执行后IOError同样会报错,except并没有捕获NameError 

#如果有多段代码

[root@zabbix 123]# cat try.py #!/usr/bin/pythontry:    open('test.log')                #此处的test.log文件是存在的    print hello                     #此处的hello是一个变量,不是字符串except IOError,msg:    pass[root@zabbix 123]# python try.py Traceback (most recent call last):  File "try.py", line 4, in 
    print helloNameError: name 'hello' is not defined
  #当执行到hello时,提示未命名;

   言外之意:当程序出现异常时,程序会终止,随后捕获异常,如果再次出现异常,也可以再次捕获

[root@zabbix 123]# cat try.py #!/usr/bin/pythontry:    open('test.log')    print helloexcept IOError,msg:    passexcept NameError,msg:    pass[root@zabbix 123]# python try.py
#当再次执行时,异常被掩盖。

#再次强调异常的捕获,是根据异常的名称的定义的!

异常处理:pass 只是掩盖了异常,并不是无任何其它操作,(例如定义一些异常处理的函数来解决问题)!

范例:

[root@zabbix 123]# cat try.py #!/usr/bin/python#coding:utf8filename = raw_input("请输入要操作的文件:")try:    open(filename)    print hellpexcept IOError,msg:    print "指定的文件不存在,请重新输入"except NameError,msg:    print "内部变量调用错误!"[root@zabbix 123]# python try.py 请输入要操作的文件:test.log内部变量调用错误![root@zabbix 123]# python try.py 请输入要操作的文件:a.log指定的文件不存在,请重新输入#处理可能出现问题的程序段,捕获问题进行相应的处理。

抛出机制:

1、如果在运行时发生异常的话,解释器会查找相应的处理语句(称为handler)

2、要是在当前函数里没有找到的话,它会将异常传递给上层的调用函数,看看那里能不能处理。

3、如果在最外层(全局”main“)还是没有找到的话,解释器就会退出,同时打印出traceback以便让用户找出错误产生的原因。

#注意虽然大多数错误会导致异常,但一个异常不一定代表错误。有时候他们只是一个警告,有时候他们可能是一个终止信号,比如退出循环等。

finally字句:

Python提供try-finally子句,表达:不关心捕捉的错误,且错误是否发生,这些代码必须执行,比如文件的关闭,释放锁,把数据库链接返还给链接池等。

问题:

#!/usr/bin/python#coding:utf8filename = raw_input("请输入要操作的文件:")try:    f = open(filename)                                    print hellpexcept IOError,msg:    print "指定的文件不存在,请重新输入"except NameError,msg:    print "内部变量调用错误!"print "over"f.close()print "that's all"[root@zabbix 123]# python try.py 请输入要操作的文件:123                            #此处f对象是无指定的文件不存在,请重新输入overTraceback (most recent call last):  File "try.py", line 12, in 
    f.close()                                     #执行时出现问题NameError: name 'f' is not defined

范例:

#!/usr/bin/python#coding:utf8filename = raw_input("请输入要操作的文件:")try:    f = open(filename)    print hellpexcept IOError,msg:    print "指定的文件不存在,请重新输入"except NameError,msg:    print "内部变量调用错误!"finally:    print "ok"[root@zabbix 123]# python try.py 请输入要操作的文件:123指定的文件不存在,请重新输入ok#注意finally子句执行

raise抛出异常:

例子:

#!/usr/bin/python#coding:utf8filename = raw_input("请输入要操作的文件:")try:    f = open(filename)    print hellpexcept IOError,msg:    print "指定的文件不存在,请重新输入"except NameError,msg:    print "内部变量调用错误!"finally:    print "ok"if filename == "hello":    raise TypeError("noting!!!")
[root@zabbix 123]# python try.py 请输入要操作的文件:new.log内部变量调用错误!ok[root@zabbix 123]# python try.py 请输入要操作的文件:hello指定的文件不存在,请重新输入okTraceback (most recent call last):  File "try.py", line 14, in 
    raise TypeError("noting!!!")TypeError: noting!!!#此处抛出异常

注意:异常的类型不可以随便指定,需python中可以识别、正常处理的异常。

如:

........if filename == "hello":    raise OtherError("noting!!!")执行后:Traceback (most recent call last):  File "try.py", line 14, in 
    raise OtherError("noting!!!")NameError: name 'OtherError' is not defined

常见的python异常: