在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语句中的处理语句失败了,也是如此。
----------------------------------------------