python和现代很多编程语言一样提供了异常处理机制,它向程序员提供了一种在运行时发现错误,进行恢复处理,然后继续执行的能力就是 : try-except结构,这个结构和我之前抛出错误博客中的try-catch结构很相似。
运行时发生异常,解释器查找相应的处理语句(handler)。要是在当前函数里没有找到,就将异常传递给上层调用函数,让上层尝试处理,如果直到最外的全局层都没有找到,就会打印出traceback,让用户找出错误原因进行修改。
虽然大多数错误都会导致异常,但是一个以唱不一定代表有错误发生(例如程序员不看alarm,只看error),有时它们也做为一个通知上层退出循环的信号等其他用处。
异常处理可以处理一个简单的异常到一系列多个不同的异常类型:
try:
‘和其他语言差不多,再此处添加测试语句’
except ¥name¥, e:
¥name¥是异常的命名
统一段语句可以处理多个异常类型,只需要把它们放进元组就可以,或者为多个异长创建对应的多个处理语句:
try:
get_item_information()
except (TypeError,ValueError),e:
print "ERROR: you get an error data",e
except ArithmeticError,e:
print "ERROR: some error about admin is occurred",e
(英语语法不保证对,之前忘记提醒异常的命名是每个单词首字母大写基本上是第一个字母和error的e大写)
而所有异常的根类(root class)Exception也可以被except语句作为异常名使用,所以有哪一个异常被前面设计的诸多语句放过的话可以在最后加上它一网打尽。
当不关心异常引发怎样的错误时,可以使用try-finally语句无论异常引发怎样的错误finally中的内容都会执行,没有发生异常和发生异常时try语句结束后,finally中的内容都会执行。但是他不会消除异常,异常仍然会在调用连理寻找能处理它的语句,直到被用户看到(就好象买火柴的小女孩找不到顾客就升天去了一样)。
和其他语言一样除了捕捉和无视异常外,python也能抛出异常就是raise语句,但其实可以看成是一个特殊的打印机制,当满足条件时(因为关于异常的捕获后抛出所以应该说的是不满足条件么?就使用者条语句的情况而言,不,应该说是所有语句的执行都是因为符合上面的条件所以才执行了下面的语句)就执行打印,这个打印格式已经确定,即:
raise TypeError("ERROR foo(): something you want to say to help you kill the question" #sometime really want to kill every question what happened in my computer)
当然说是打印也不完全对,这里只是打个比方
以下一些常见的异常(虽然永远都不要见到最好):
AssertionError assert(断言)语句失败
AttributeError 试图访问对象所没有的一个属性
IOError 输入输出异常,基本上是无法打开文件
ImportError 无法引入模块或者包,基本上是路径问题
IndentationError 语法错误,python中应该就是对齐问题
IndexError 索引错误,索引超出长度,一般是提前删除了一个还要访问的数据信息
KeyError 试图访问字典中不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError python代码不能编译
TyprError 传入数据类型与要求不符合,太常见了,已经到了出现就不知道怎么改的地步了。
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它。所以说不要轻易设置全局变量
ValueError 传入一个调用者不期望的值(哪怕类型正确,它怎么知道不需要的)
在Django框架下使用python语言,这个框架中也使用了异常,虽然大都在内部处理掉了不进入日常的界限,但是类似于http404之类的异常还是需要用户直接使用的,这样就不会只是传回一个特殊标志,而是接到异常通知就转去处理错误。
分享到:
评论