原文章:Python异常处理总结
一、何谓异常处理
在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的。异常的出现一方面是因为写代码时粗心导致的语法错误,这种错误在程序编译时就可以发现;另一方面也可能是因为程序逻辑错误,这种错误往往是不可避免地,只能通过异常处理来防止程序退出。
二、异常类型
Python自带的异常处理机制非常强大,提供了很多内置异常类,可向用户准确反馈出错信息。Python是面向对象语言,认为一切皆对象,所以异常也是对象。Python异常处理机制中的BaseException是所有内置异常的基类,但用户定义的类并不直接继承BaseException,所有的异常类都是从Exception继承,且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。
Python内置异常类继承层次结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
|
三、异常捕获与处理
1 |
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
需要注意的是:
- try - except虽然结构简单,但可能捕获与程序无关、意料之外的系统异常,而且可能意外拦截其他处理器的异常。例如,在Python中,即表示系统离开调用(sys.exit())也会出发异常,然而这种异常我们通常不需要捕获。所以,这种结构尽量避免使用,而使用 <try: ... except [异常名] as e: ...>这种结构。
- Exception类是所有Python异常类的父类,所以except Exception将可以捕获任何异常,换句话说,它是万能异常处理句式。
- 有一种错误没办法抓住:缩进错误,例如:
四、raise(主动抛出异常)
有时候,异常可以作为代码运行的标志,通过主动触发异常可以改变代码的运行路线,从而提高代码健壮性。主动触发异常需使用raise关键字,其语法结构如下:
1 |
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
五、assert(断言)
根据assert后面的表达式的真假来控制程序流。 asset语法结构如下:
1 |
|
若为expression结果为True,则往下执行。若为False,则中断程序并调用默认的异常处理器抛出AssertionError异常,同时输出指定的提示信息。
1 2 3 4 5 6 7 8 |
|
断言的作用是:可以做一些检查,增强安全性
六、with/as上下文管理器
with/as语句通常是作为try/finally语句的替代方案,不过with/as更加优雅。在有一些任务中,可能事先需要设置,然后不管在任务过程中是否顺利(有无异常抛出),最后后做清理工作。对于这种场景, with/as语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读写数据,但不管读写数据是否有异常发生,最后都要关闭文件句柄。
with/as语句的基本格式如下:
1 2 |
|
在这里的expression会返回一个对象,as子句是可选的,当存在as子句时,expression返回的对象会赋值给variable。
使用with/as语句将一段字符串写入文件:
1 2 3 4 5 6 7 8 9 10 |
|
七、自定义异常类
如果Python提供的内置异常内不满足使用要求,那么,可以自定义一个异常类,自定义异常类必须继承Exception类。
1 2 3 4 5 6 7 8 9 10 11 |
|
需要注意:
- 自定义的异常不会自动触发,所以需要主动触发。会自动触发的都是标准的异常
- 自定义的异常不能和原有的异常重名
八、总结
Python异常处理机制总结:
- Python异常处理的常用内置类
- 异常捕获/处理句式结构
- 主动触发异常,断言
- with上下文管理协议
- 自定义异常类
在我们使用异常处理后,若有异常发生,我们需要查看错误的详细信息,以及在哪一行出的错误,需要使用 traceback 模块
1 2 3 4 5 |
|