python异常处理

在python中,使用try...except来处理异常。

# -*- coding:utf-8 -*-

while True:
    try:
        a = int(raw_input("enter number"))
        break
    except:
        print "err"
    print "test"


执行上面这段代码,当输入a的时候,会得到如下结果:

enter numbera
err
test
enter number

---------------------------------------------------

如果异常发生之后,在except中没有找到相应的处理语句,那么它就会向上级传递异常。如果最终还是没有找到处理语句,那么抛出unhandle exception并且终止程序的运行。显示错误信息。

--------------------------------------------------

一个try语句可以跟着多个except语句用来处理不同的异常。

比如说,

# -*- coding:utf-8 -*-

while True:
    try:
        a = int(raw_input("enter number"))
        break
    except NameError:
        print "err"
    except TypeError:
        print "err"
    except RuntimeError:
        print "err"
    print "test"

还可以这样写:

# -*- coding:utf-8 -*-

while True:
    try:
        a = int(raw_input("enter number"))
        break
    except (NameError, TypeError, RuntimeError):
        print "err"
    print "test"

并且最后的excpet可以省略捕捉的异常的名字,表示捕捉全部异常并处理。就像下例子中最后的except一样。

# -*- coding:utf-8 -*-

while True:
    try:
        a = int(raw_input("enter number"))
        break
    except (NameError, TypeError, RuntimeError):
        print "err"
    except:
        pass
    print "test"

---------------------------------------------------

try...excpet语句还可以带有一个else语句。

# -*- coding:utf-8 -*-

while True:
    try:
        a = int(raw_input("enter number"))
       
    except (NameError, TypeError, RuntimeError):
        print "err"
    except:
        pass
    else:
        print "here is else."
    print "test"

上面例子中,else就是一个例子。如果try没有发生异常,那么else就会执行。在例子中输入一个数字,那么不会发生异常。程序就会输出here is test。

使用else语句的好处是,使try能专注于自己要捕获的异常。如果把else也放进try里面,那么有可能捕获到本不属于自己职责范围内的异常。

-------------------------------------------------

在python中使用raise来抛出一个异常。

# -*- coding:utf-8 -*-

raise NameError("hi there")

那么执行的时候会收到如下消息:

Traceback (most recent call last):
  File "C:\Users\naughty\workspace\ttt\com\d.py", line 3, in <module>
    raise NameError("hi there")
NameError: hi there

-------------------------------------

如果遇到一个异常,但是不想处理它,那么可以原封不动的把异常抛出到上层调用代码。

# -*- coding:utf-8 -*-

def here():
    try:
        a = int(raw_input("enter here:"))
        print a
    except:
        raise

def test():
    try:
        here()
    except:
        print "handle"

if __name__ == "__main__":
    test()

上面例子中,here函数中的except仅仅重新抛出了异常。在test函数中得到了处理。

--------------------------------

用户自定义异常

在python中,用户可以通过定义一个类来实现自己的异常。这个类必须继承自Exception。

# -*- coding:utf-8 -*-

class MyErr(Exception):
    '''
    my own exception
    '''
    def __init__(self, value):
        self.value=value
    
    def __str__(self, value):
        return self.value
    
if __name__ == "__main__":
    raise MyErr("hi,how are you?")

上面代码中,MyErr继承自Exception并且重写了__str__方法。

执行代码的时候,可以得到如下异常:

Traceback (most recent call last):
  File "C:\Users\naughty\workspace\ttt\com\d.py", line 14, in <module>
    raise MyErr("hi,how are you?")
__main__.MyErr

这正是我们定义的类。

注:异常类与其他类并没有什么本质上的不同。也可以执行一些函数什么的。但是通常,人们只是用异常类来表示一些异常信息。保持异常类很simple。并不用他们做很复杂的处理动作。

在python中,与大多数其他异常类类似,自己定义的异常类,最好也是以Error结尾。

-----------------------------------------------------

定义清理行为

try语句后面还可以跟着一个finally语句。用来做一些清理动作。finally语句块中的内容,不论try语句中是否发生异常,都会执行。

【不论try语句中发生了什么事情,finally都会执行】

---------------------------

了解了try语句的清理行为,那么就需要了解一下预定义的清理行为:with。

with可以在代码块执行完毕之后,关闭所有资源,即使再with语句中的处理语句失败了,也是如此。

----------------------------------------------

你可能感兴趣的:(python异常处理)