错误与异常

  • AttributeError:尝试访问未知的对象属性
  1. eg.
  2. >>> class myClass(object):
  3. ... pass
  4. ...
  5. >>> my = myClass()
  6. >>> my.name = 'Yanta'
  7. >>> my.name
  8. 'Yanta'
  9. >>> my.age
  10. Traceback (most recent call last):
  11. File "<stdin>", line 1, in <module>
  12. AttributeError: 'myClass' object has no attribute 'age'

检测与处理异常

异常通过try语句检测,任何在try语句块里的代码都会被检测,检查有无异常发生

try语句有两种主要形式:try-except和try-finally. 这两个语句是互斥的,也就是说你只能使用其中的一种。一个try语句可以对应一个或者多个except语句,但是只能对应一个finally语句,或者一个try-except-finally复合语句。

也就是说:以下三种形式任选其一。

  1. 1try-except
  2. 2try-finally
  3. 3try-except-finally

其中可以使用try-except语句检测和处理异常,也可以添加一个可选的else子句处理没有探测到异常的执行的代码。

try-finally只允许检测异常并作一些必要的清除工作(无论发生错误与否),没有任何异常处理措施。

复合语句,两者都可以做到。

try-except

try-except语句定义了进行异常监控的一段代码,并且提供了异常处理的机制。

语法形式:

  1. try:
  2. try_suite #监控这里的异常
  3. except Expection[, reason]:
  4. expect_suite #异常处理代码

eg.

  1. >>> try:
  2. ... os.remove('test01.log')
  3. ... except IOError, e:
  4. ... print 'Could not remove the file:', e
  5. ...
  6. Traceback (most recent call last):
  7. File "<stdin>", line 2, in <module>
  8. OSError: [Errno 2] No such file or directory: 'test01.log' #异常报错

处理多个异常的try-except语句:

  1. >>> try:
  2. ... os.remove('test01.log')
  3. ... except OSError, e:
  4. ... print 'No such file or directory: ', e
  5. ... except TypeError, e:
  6. ... print 'Type argument Error: ', e
  7. ...
  8. No such file or directory: [Errno 2] No such file or directory: 'test01.log'

捕获所有异常

1、有些异常不是由于错误条件引起的,比如:SystemExit(当前的python程序需要退出)和KeyboardInterupt(用户按下了Ctrl+C组合键)

2、python2.5之后python异常的继承发生了变化:

  1. - BaseException
  2. | - KeyboardInterupt
  3. | - SystemExit
  4. | - Exception
  5. | - (all other current built-in exceptions)所有当前内建异常

这样,当你有一个Exception处理器后,你不必为这两个一场创建额外的处理器。

  1. try:
  2. :
  3. except Exception, e:
  4. # handle real errors

如果你确实需要捕捉所有的异常,那么就需要使用BaseException:

  1. try:
  2. :
  3. except BaseException, e:
  4. # handle real errors

切记

不要再try_suite语段填写入一大段代码,再用一个通用的except语句过滤掉任何致命的错误,忽略他们。

try-except语句不是用来捕捉过滤所有错误然后忽略他们。

异常参数

实际上就是保存引发异常的具体信息,一般为我们上述书写的try-except与剧中的e:

  1. >>> try:
  2. ... os.remove('test01.log')
  3. ... except OSError, e:
  4. ... print 'No such file or directory: ', e
  5. ... except TypeError, e:
  6. ... print 'Type argument Error: ', e
  7. ...
  8. No such file or directory: [Errno 2] No such file or directory: 'test01.log'

这个e是OSError异常类的实例,可以调用他的一些属性来得到详细信息。也可以调用内置的type()str()来显示信息:

  1. >>> type(e)
  2. <type 'exceptions.OSError'>
  3. >>> str(e)
  4. "[Errno 2] No such file or directory: 'test01.log'"
  5. >>> print e
  6. [Errno 2] No such file or directory: 'test01.log'
  7. >>> e
  8. OSError(2, 'No such file or directory')
  9. >>> e.__class__
  10. <type 'exceptions.OSError'>
  11. >>> e.__class__.__doc__
  12. 'OS system call failed.'
  13. >>> e.__class__.__name__
  14. 'OSError'

else语句

在try-except语句段中,else语句只有在try范围中没有异常被检测到时,才会被执行。而且在else范围的任何代码被运行前,try范围的所有代码必须被完全执行成功。不能引发异常。

语句格式:

  1. try:
  2. try_suite
  3. except :
  4. except_suite
  5. else:
  6. else_suite

finally语句

finally语句是无论异常是否发生,是否捕捉都会执行的一段代码。你也可以将finally语句仅仅和try配合使用,也可以与try-except语句配合使用。

其中try-finally语句是无论异常是否发生,finally代码段都会被执行。

当try代码段引发一个异常时,会马上跳转到finally语句段,然后当finally代码段被执行完毕后会继续向上一层引发异常:

  1. >>> try:
  2. ... os.remove('test01.log')
  3. ... finally:
  4. ... print '无论如何这里都会被执行!'
  5. ...
  6. 无论如何这里都会被执行!
  7. Traceback (most recent call last):
  8. File "<stdin>", line 2, in <module>
  9. OSError: [Errno 2] No such file or directory: 'test01.log'

切记

若果finally代码段引发了另一个异常或者由于return、break、continue语法而终止,原来的异常将丢失而且无法重新引发。

  1. >>> try:
  2. ... os.remove('test01.log')
  3. ... finally:
  4. ... os.rmdir('test')
  5. ...
  6. Traceback (most recent call last):
  7. File "<stdin>", line 4, in <module>
  8. OSError: [Errno 2] No such file or directory: 'test'
  9. >>>

上下文管理

with语句是用来简化代码的,这与用try-except和try-finally福哦想达到的目的前后呼应。try-except和try-finally的一种特定的配合用法是保证共享的资源的唯一分配,并在任务结束时候释放它。比如文件(数据、日志、数据库等)、线程资源、简单同步、数据库连接,等等。with语句的目的就是应用在这种场景。

然而,with语句的目的在于从流程图中巴try、except和fianlly关键字和资源分配释放相关代码统统去掉,而不是像try-except-finally那样仅仅简化代码为之所用。

基本语法如下:

  1. with context_expr [as var]:
  2. with_suite

with语句涉及到一些内在的处理细节。with语句仅仅支持上下文管理协议的对象,只有内建了“上下文管理”的对象可以和with一起工作。目前支持该协议的对象有:

  1. * file
  2. * decimal.Context
  3. * thread.LockType
  4. * thread.Lock
  5. * thread.RLock
  6. * thread.Condition
  7. * thread.Semaphore
  8. * thread.BoundedSemaphore

一打开文件为例,with语句会完成准备工作,当完成操作后,会关闭文件。而且无论在这段代码的开始、中间和结尾是发生日常,都会执行清理的代码,此外文件仍会自动关闭。eg.

  1. >>> with open('test.log', 'r') as f0:
  2. ... for eachline in f0:
  3. ... print eachline
  4. ...
  5. 121
  6. weqefse
  7. 1rfewf
  8. 1rfegvd
  9. 1rfvfdfsv cb
  10. fsdvfvc

现在我们来测试f0:

  1. >>> f0
  2. <closed file 'test.log', mode 'r' at 0x7fbe66a25300>
  3. >>> type(f0)
  4. <type 'file'>
  5. >>> f0.closed #文件是否被关闭
  6. True
  7. >>> f0.name
  8. 'test.log'
  9. >>> f0.mode
  10. 'r'

与正常代开文件做对比:

  1. >>> ff = open('test.log', 'r')
  2. >>> type(ff)
  3. <type 'file'>
  4. >>> ff.closed #文件是否被关闭
  5. False
  6. >>> ff.name
  7. 'test.log'
  8. >>> ff.mode
  9. 'r'
  10. >>> ff.close()
  11. >>> ff
  12. <closed file 'test.log', mode 'r' at 0x7fbe66a25420>
  13. >>> type(ff)
  14. <type 'file'>
  15. >>> ff.name
  16. 'test.log'
  17. >>> ff.mode
  18. 'r'
  19. >>> ff.closed #文件是否被关闭
  20. True

触发异常

Python提供一种机制让程序员明确的触发异常,这就是raise语句。

raise语句的一般用法:

  1. raise [SomeException [, args [, traceback]]]

raise语句的用法列表:

断言

断言是一套必须等价于布尔真的判定;此外发生异常也就意味着表达式为假。

断言通过assert语句来实现,测试一个表达式,如果返回值为假,则触发异常。

assert语句语法格式:

  1. assert expression [, arguments]

示例:


  1. >>> assert 1 == 0
  2. Traceback (most recent call last):
  3. File "<stdin>", line 1, in <module>
  4. AssertionError
  5. >>> try:
  6. ... assert 1 == 0
  7. ... except AssertionError, e:
  8. ... e
  9. ...
  10. AssertionError()

python内建异常

  1. BaseException #所有异常的基类
  2. SystemExit #解释器请求退出
  3. KeyboardInterrupt #用户中断执行(通常是输入^C)
  4. Exception #常规错误的基类
  5. StopIteration #迭代器没有更多的值
  6. GeneratorExit #生成器(generator)发生异常来通知退出
  7. StandardError #所有的内建标准异常的基类
  8. ArithmeticError #所有数值计算错误的基类
  9. FloatingPointError #浮点计算错误
  10. OverflowError #数值运算超出最大限制
  11. ZeroDivisionError #除(或取模)零 (所有数据类型)
  12. AssertionError #断言语句失败
  13. AttributeError #对象没有这个属性
  14. EOFError #没有内建输入,到达EOF 标记
  15. EnvironmentError #操作系统错误的基类
  16. IOError #输入/输出操作失败
  17. OSError #操作系统错误
  18. WindowsError #系统调用失败
  19. ImportError #导入模块/对象失败
  20. LookupError #无效数据查询的基类
  21. IndexError #序列中没有此索引(index)
  22. KeyError #映射中没有这个键
  23. MemoryError #内存溢出错误(对于Python 解释器不是致命的)
  24. NameError #未声明/初始化对象 (没有属性)
  25. UnboundLocalError #访问未初始化的本地变量
  26. ReferenceError #弱引用(Weak reference)试图访问已经垃圾回收了的对象
  27. RuntimeError #一般的运行时错误
  28. NotImplementedError #尚未实现的方法
  29. SyntaxError Python #语法错误
  30. IndentationError #缩进错误
  31. IndentationError #缩进错误
  32. IndentationError #缩进错误
  33. TabError #Tab 和空格混用
  34. SystemError #一般的解释器系统错误
  35. TypeError #对类型无效的操作
  36. ValueError #传入无效的参数
  37. UnicodeError #Unicode 相关的错误
  38. UnicodeDecodeError #Unicode 解码时的错误
  39. UnicodeEncodeError #Unicode 编码时错误
  40. UnicodeTranslateError #Unicode 转换时错误
  41. Warning #警告的基类
  42. DeprecationWarning #关于被弃用的特征的警告
  43. FutureWarning #关于构造将来语义会有改变的警告
  44. OverflowWarning #旧的关于自动提升为长整型(long)的警告
  45. PendingDeprecationWarning #关于特性将会被废弃的警告
  46. RuntimeWarning #可疑的运行时行为(runtime behavior)的警告
  47. SyntaxWarning #可疑的语法的警告
  48. UserWarning #用户代码生成的警告

异常与sys模块

另一种获取异常信息的途径是通过sys模块的exc_info()函数,其提供一个三元组的信息。

  1. >>> try:
  2. ... float('ada1313')
  3. ... except:
  4. ... import sys
  5. ... exc_tuple = sys.exc_info()
  6. ...
  7. >>> print exc_tuple
  8. (<type 'exceptions.ValueError'>, ValueError('could not convert string to float: ada1313',), <traceback object at 0x7fa699bfc908>)

这个三元组中包含着三个信息:

1、异常类

2、异常类的实例

3、跟踪记录对象

Python——追加学习笔记(三)的更多相关文章

  1. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  2. Python——追加学习笔记(四)

    函数 1.python里的函数可以返回一个值或者对象,知识在返回一个容器对象的时候有点不同,看起来像是能返回多个对象. >>> def bar(): ... return 'abc' ...

  3. Python——追加学习笔记(一)

    映射.字典 ## 映射类型内建函数 * dict Error: Python核心编程(第二版)p170 >>> dict([['x', 1], ['y', 2]]) {'y': 2, ...

  4. python 3 学习笔记 (三)

    1. 字典 定义:{key1:value1,key2:value2},key-value结构,key必须可hash特性:1.可存放多个值2.可修改指定key对应的值,可变3.无序 1.1. 创建字典 ...

  5. 【Python】学习笔记三:序列

    sequence(序列) sequence(序列)是一组有序的元素的集合,序列可以有任何元素,也可以没有元素 元组与表的区别:一旦建立,tuple的各个元素不可再变更,而list的各个元素可以再变更 ...

  6. Python爬虫学习笔记(三)

    Cookies: 以抓取https://www.yaozh.com/为例 Test1(不使用cookies): 代码: import urllib.request # 1.添加URL url = &q ...

  7. Python——追加学习笔记(二)

    文件处理 # 文件内移动 seek()方法可以在文件中移动文件指针到不同的位置,offset字节代表相对于某个位置偏移量,默认为0,代表从文件开头算起,1代表从当前位置算起,2代表从文件末尾算起. s ...

  8. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  9. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

随机推荐

  1. Trailing Loves (or L'oeufs?)

    The number "zero" is called "love" (or "l'oeuf" to be precise, literal ...

  2. $_SERVER['SCRIPT_NAME']、$_SERVER['SCRIPT_FILENAME']及__FILE__不同

    $_SERVER['SCRIPT_NAME'].$_SERVER['SCRIPT_FILENAME']及__FILE__不同 在PHP中,有时需要知道脚本所处的位置,这时会用到$_SERVER['SC ...

  3. Python入门笔记——(2)列表和元组

    一.序列 python包含6种内建的序列:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象.序列中每个元素被分配一个序号即索引,第一个索引为0,第二个为1,以此类推.也可以 ...

  4. PIE SDK专题制图下屏幕坐标转地图坐标

    1.    功能简介 PIESDK提供了专题制图下鼠标屏幕坐标转地图坐标功能. 2. 功能实现说明 2.1屏幕坐标转地图坐标 此功能用到了IPageLayout.ToMapPoint()方法,它的主要 ...

  5. 设计模式学习总结(八)策略模式(Strategy)

    策略模式,主要是针对不同的情况采用不同的处理方式.如商场的打折季,不同种类的商品的打折幅度不一,所以针对不同的商品我们就要采用不同的计算方式即策略来进行处理. 一.示例展示: 以下例子主要通过对手机和 ...

  6. oracle 基础知识(十一)----表空间结构

    一,逻辑结构图 二.tablespace 01,Oracle表空间 它是一个逻辑的概念,它在物理上是不存在的. 02,oracle 存储结构 03.表空间特性 一个数据库可以包含多个表空间,一个表空间 ...

  7. android中的Touch研究

    android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解. 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN-& ...

  8. php中的$_GET如何获取带有“#”的参数

    <?php echo $_GET['key']; ?> 当url为http://test.com/c.php?key=999时,正常输出:999 当url为http://test.com/ ...

  9. Django 入门项目案例开发(上)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. Django 入门案例开发(中) http://www.cnblogs.com/focusBI ...

  10. 2018湖湘杯web、misc记录

    1.题目名 Code Check 打开题目,右键发现有id参数的url,简单base64解码以后发现不是明文,说明利用了其他的加密方式,那么应该会有具体的加密方式给我们,于是试试常见的文件泄露,可以发 ...