python异常处理

来源:互联网 发布:mysql syntax 编辑:程序博客网 时间:2024/06/18 05:09

一、捕捉异常
Try…except…
假如,我们已经知道这种类型的错误,那么就可以通过一个异常扑捉来扑捉这个错误。我们可以通过try… 来接收这个错误。打开文件写入:

try:    open("abc.txt",'r')except IOError:    pass

  再来运行程序就会看不到任何错误,因为我们用 except 接收了这个 IOError 错误。pass 表示实现了相应的实现,但什么也不做。
假如我不是打开一个文件,而是输出一个没有定义的变量呢?

try:    print aaexcept IOError:    pass

显然,在上面的代码中我并没有对 aa 赋值,运行结果:

Traceback (most recent call last):File "/home/fnngj/py_se/tryy.py", line 3, in <module>print aaNameError: name 'aa' is not defined

  我们已经用 except 接收错误了,为什么错误还是还是抛出来了。如果你细心会发现这一次的错误类型是 NameError ,而我接收类型是 IOError ,所以要想接收这个 print 的错误,那么需要修改接收错误的类型为 NameError
  虽然,我知道 print 语句是可能会抛一个 NameError 类型的错误,虽然接收了这个类型错误,但我不知道具体的错误提示信息是什么。那么,我能不能把错误信息打印出来呢?当然可以:

try:    print aaexcept NameError, msg:    print msg

异常的抛出机制:
1、如果在运行时发生异常,解释器会查找相应的处理语句(称为 handler).
2、要是在当前函数里没有找到的话,它会将异常传递给上层的调用函数,看看那里能不能处理。
3、如果在最外层(全局“main”)还是没有找到的话,解释器就会退出,同时打印出 traceback 以便让用户找到错误产生的原因。
注意:虽然大多数错误会导致异常,但一个异常不一定代表错误,有时候它们只是一个警告,有时候它们可能是一个终止信号,比如退出循环等。

try…finally…
Try…finally…子句用来表达这样的情况:
我们不管捕捉到的是什么错误,无论错误是不是发生,这些代码“必须”运行,比如文件关闭,释放锁,把数据库连接返还给连接池等。
poem.txt内容:
abc
def
ghi
lmn
opq
代码:

#coding=utf-8import timetry:    f=file('poem.txt')    while True:# our usual file-reading idiom        line=f.readline()        if len(line)==0:            break        time.sleep(2)        print line,finally:    f.close()    print 'Cleaning up...closed the file'

在 unittest 单元测试框架中,TestCase 类提供了一些方法来检查并报告故障,如表5.x :

|Method | Checks that | New in |

|assertEqual(a, b) | a == b | |
|assertNotEqual(a, b) | a != b | |
|assertTrue(x) | bool(x) is True | |
|assertFalse(x) | bool(x) is False | |
|assertIs(a, b) | a is b | 2.7 |
|assertIsNot(a, b) | a is not b | 2.7 |
|assertIsNone(x) | x is None | 2.7 |
|assertIsNotNone(x) | x is not None | 2.7 |
|assertIn(a, b) | a in b | 2.7 |
|assertNotIn(a, b) | a not in b | 2.7 |
|assertIsInstance(a, b) | isinstance(a, b) | 2.7 |

|assertNotIsInstance(a, b) | not isinstance(a, b)| 2.7 |

以下为 python 2.7 版新增的断言方法:
assertIs(first, second, msg=None)
assertIsNot(first, second, msg=None)
测试的 first 和 second 是(或 不是)相同的对象。
assertIsNone(expr, msg=None)
assertIsNotNone(expr, msg=None)
测试 expr 是(或 不是)为 None
assertIn(first, second, msg=None)
assertNotIn(first, second, msg=None)
测试 first 是(或不是)在 second 中。second 包含是否包含 first 。
assertIsInstance(obj, cls, msg=None)
assertNotIsInstance(obj, cls, msg=None)
测试 obj 不(或 不是)cls 的一个实例。(obj 和 cls 可以是一个类或元组),要检查他们的类型使
用 assertIs(type(obj), cls)。
更多断言方法请参考 python unittest 文档。