收藏 分享(赏)

python-错误和异常小结.doc

上传人:天天快乐 文档编号:431152 上传时间:2018-04-05 格式:DOC 页数:13 大小:130KB
下载 相关 举报
python-错误和异常小结.doc_第1页
第1页 / 共13页
python-错误和异常小结.doc_第2页
第2页 / 共13页
python-错误和异常小结.doc_第3页
第3页 / 共13页
python-错误和异常小结.doc_第4页
第4页 / 共13页
python-错误和异常小结.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、原文链接 http:/ Python 异常的全面介绍的文章,这只是在学习 Python异常后的一篇笔记式的记录和小结性质的文章。什么?你还不知道什么是异常,额.1.Python 异常类Python 是面向对象语言,所以程序抛出的异常也是类。常见的 Python 异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不用 Python 了)。python 标准异常异常名称 描述BaseException 所有异常的基类SystemExit 解释器请求退出KeyboardInterrupt 用户中断执行(通常是输入C)Exception 常规错误的基

2、类StopIteration 迭代器没有更多的值GeneratorExit 生成器(generator)发生异常来通知退出SystemExit Python 解释器请求退出StandardError 所有的内建标准异常的基类ArithmeticError 所有数值计算错误的基类FloatingPointError 浮点计算错误OverflowError 数值运算超出最大限制ZeroDivisionError 除( 或取模)零 (所有数据类型 )AssertionError 断言语句失败AttributeError 对象没有这个属性EOFError 没有内建输入,到达 EOF 标记Environ

3、mentError 操作系统错误的基类IOError 输入/输出操作失败OSError 操作系统错误WindowsError 系统调用失败ImportError 导入模块/对象失败KeyboardInterrupt 用户中断执行(通常是输入C)LookupError 无效数据查询的基类IndexError 序列中没有没有此索引(index)KeyError 映射中没有这个键MemoryError 内存溢出错误(对于 Python 解释器不是致命的)NameError 未声明/初始化对象 (没有属性)UnboundLocalError 访问未初始化的本地变量ReferenceError 弱引用(

4、Weak reference)试图访问已经垃圾回收了的对象RuntimeError 一般的运行时错误NotImplementedError 尚未实现的方法SyntaxError Python 语法错误IndentationError 缩进错误TabError Tab 和空格混用SystemError 一般的解释器系统错误TypeError 对类型无效的操作ValueError 传入无效的参数UnicodeError Unicode 相关的错误UnicodeDecodeError Unicode 解码时的错误UnicodeEncodeError Unicode 编码时错误UnicodeTrans

5、lateError Unicode 转换时错误Warning 警告的基类DeprecationWarning 关于被弃用的特征的警告FutureWarning 关于构造将来语义会有改变的警告OverflowWarning 旧的关于自动提升为长整型(long)的警告PendingDeprecationWarning 关于特性将会被废弃的警告RuntimeWarning 可疑的运行时行为(runtime behavior)的警告SyntaxWarning 可疑的语法的警告UserWarning 用户代码生成的警告异常 描述NameError 尝试访问一个没有申明的变量ZeroDivisionErr

6、or 除数为 0SyntaxError 语法错误IndexError 索引超出序列范围KeyError 请求一个不存在的字典关键字IOError 输入输出错误(比如你要读的文件不存在)AttributeError 尝试访问未知的对象属性ValueError 传给函数的参数类型不正确,比如给 int()函数传入字符串形2.捕获异常Python 完整的捕获异常的语句有点像:html view plaincopy1. try: 2. try_suite 3. except Exception1,Exception2,.,Argument: 4. exception_suite 5. . #other

7、 exception block 6. else: 7. no_exceptions_detected_suite 8. finally: 9. always_execute_suite 额.是不是很复杂?当然,当我们要捕获异常的时候,并不是必须要按照上面那种格式完全写下来,我们可以丢掉 else 语句,或者 finally 语句;甚至不要 exception 语句,而保留 finally 语句。额,晕了?好吧,下面,我们就来一一说明啦。2.1.try.except.语句try_suite 不消我说大家也知道,是我们需要进行捕获异常的代码。而 except 语句是关键,我们 try 捕获了代码

8、段 try_suite 里的异常后,将交给 except 来处理。try.except 语句最简单的形式如下:python view plaincopy1. try: 2. try_suite 3. except: 4. exception block 上面 except 子句不跟任何异常和异常参数,所以无论 try 捕获了任何异常,都将交给except 子句的 exception block 来处理。如果我们要处理特定的异常,比如说,我们只想处理除零异常,如果其他异常出现,就让其抛出不做处理,该怎么办呢?这个时候,我们就要给 except 子句传入异常参数啦!那个 ExceptionN 就是

9、我们要给 except 子句的异常类(请参考异常类那个表格),表示如果捕获到这类异常,就交给这个 except 子句来处理。比如:python view plaincopy1. try: 2. try_suite 3. except Exception: 4. exception block 举个例子:python view plaincopy1. try: 2. . res = 2/0 3. . except ZeroDivisionError: 4. . print “Error:Divisor must not be zero!“ 5. . 6. Error:Divisor must n

10、ot be zero! 看,我们真的捕获到了 ZeroDivisionError 异常!那如果我想捕获并处理多个异常怎么办呢?有两种办法,一种是给一个 except 子句传入多个异常类参数,另外一种是写多个except 子句,每个子句都传入你想要处理的异常类参数。甚至,这两种用法可以混搭呢!下面我就来举个例子。python view plaincopy1. try: 2. floatnum = float(raw_input(“Please input a float:“) 3. intnum = int(floatnum) 4. print 100/intnum 5. except Zero

11、DivisionError: 6. print “Error:you must input a float num which is large or equal then 1!“ 7. except ValueError: 8. print “Error:you must input a float num!“ 9. 10. rootCherish tmp# python test.py 11. Please input a float:fjia 12. Error:you must input a float num! 13. rootCherish tmp# python test.py

12、 14. Please input a float:0.9999 15. Error:you must input a float num which is large or equal then 1! 16. rootCherish tmp# python test.py 17. Please input a float:25.091 18. 4 上面的例子大家一看都懂,就不再解释了。只要大家明白,我们的 except 可以处理一种异常,多种异常,甚至所有异常就可以了。大家可能注意到了,我们还没解释 except 子句后面那个 Argument 是什么东西?别着急,听我一一道来。这个 Arg

13、ument 其实是一个异常类的实例(别告诉我你不知到什么是实例),包含了来自异常代码的诊断信息。也就是说,如果你捕获了一个异常,你就可以通过这个异常类的实例来获取更多的关于这个异常的信息。例如:python view plaincopy1. try: 2. . 1/0 3. . except ZeroDivisionError,reason: 4. . pass 5. . 6. type(reason) 7. 8. print reason 9. integer division or modulo by zero 10. reason 11. ZeroDivisionError(intege

14、r division or modulo by zero,) 12. reason._class_ 13. 14. reason._class_._doc_ 15. Second argument to a division or modulo operation was zero. 16. reason._class_._name_ 17. ZeroDivisionError 上面这个例子,我们捕获了除零异常,但是什么都没做。那个 reason 就是异常类ZeroDivisionError 的实例,通过 type 就可以看出。2.2try . except.else 语句现在我们来说说这个

15、else 语句。Python 中有很多特殊的 else 用法,比如用于条件和循环。放到 try 语句中,其作用其实也差不多:就是当没有检测到异常的时候,则执行else 语句。举个例子大家可能更明白些:python view plaincopy1. import syslog 2. try: 3. . f = open(“/root/test.py“) 4. . except IOError,e: 5. . syslog.syslog(syslog.LOG_ERR,“%s“%e) 6. . else: 7. . syslog.syslog(syslog.LOG_INFO,“no exceptio

16、n caughtn“) 8. . 9. f.close() 2.3 finally 子句finally 子句是无论是否检测到异常,都会执行的一段代码。我们可以丢掉 except 子句和 else 子句,单独使用 try.finally,也可以配合 except 等使用。例如 2.2 的例子,如果出现其他异常,无法捕获,程序异常退出,那么文件 f 就没有被正常关闭。这不是我们所希望看到的结果,但是如果我们把 f.close 语句放到 finally 语句中,无论是否有异常,都会正常关闭这个文件,岂不是很 妙python view plaincopy1. import syslog 2. try:

17、 3. . f = open(“/root/test.py“) 4. . except IOError,e: 5. . syslog.syslog(syslog.LOG_ERR,“%s“%e) 6. . else: 7. . syslog.syslog(syslog.LOG_INFO,“no exception caughtn“) 8. . finally: 9. f.close() 大家看到了没,我们上面那个例子竟然用到了 try,except,else,finally 这四个子句!:-),是不是很有趣?到现在,你就基本上已经学会了如何在 Python 中捕获常规异常并处理之。3.两个特殊的

18、处理异常的简便方法3.1 断言(assert)什么是断言,先看语法:python view plaincopy1. assert expression,reason 其中 assert 是断言的关键字。执行该语句的时候,先判断表达式 expression,如果表达式为真,则什么都不做;如果表达式不为真,则抛出异常。reason 跟我们之前谈到的异常类的实例一样。不懂?没关系,举例子!最实在!python view plaincopy1. assert len(love) = len(like) 2. assert 1=1 3. assert 1=2,“1 is not equal 2!“ 4.

19、 Traceback (most recent call last): 5. File “, line 1, in 6. AssertionError: 1 is not equal 2! 我们可以看到,如果 assert 后面的表达式为真,则什么都不做,如果不为真,就会抛出AssertionErro 异常,而且我们传进去的字符串会作为异常类的实例的具体信息存在。其实,assert 异常也可以被 try 块捕获:python view plaincopy1. try: 2. . assert 1 = 2 , “1 is not equal 2!“ 3. . except AssertionEr

20、ror,reason: 4. . print “%s:%s“%(reason._class_._name_,reason) 5. . 6. AssertionError:1 is not equal 2! 7. type(reason) 8. 3.2.上下文管理( with 语句)如果你使用 try,except,finally 代码仅仅是为了保证共享资源(如文件,数据)的唯一分配,并在任务结束后释放它,那么你就有福了!这个 with 语句可以让你从try,except,finally 中解放出来!语法如下:python view plaincopy1. with context_expr a

21、s var: 2. with_suite 是不是不明白?很正常,举个例子来!python view plaincopy1. with open(/root/test.py) as f: 2. . for line in f: 3. . print line 上面这几行代码干了什么?(1 )打开文件/root/test.py(2 )将文件对象赋值给 f(3 )将文件所有行输出(4)无论代码中是否出现异常, Python 都会为我们关闭这个文件,我们不需要关心这些细节。这下,是不是明白了,使用 with 语句来使用这些共享资源,我们不用担心会因为某种原因而没有释放他。但并不是所有的对象都可以使用 with 语句,只有支持上下文管理协议(context management protocol)的对象才可以,那哪些对象支持该协议呢?如下表:file decimal.Contextthread.LockTypethreading.Lockthreading.RLockthreading.Conditionthreading.Semaphore

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报