异常就是程序运行时因代码的逻辑错误或用户的不合法输入导致程序无法正常运行的现象,而通常这种情况发生时我们的Python就会报错,并且Python 还会打印出检测到的错误发生的位置。这就是一个错误处理器(ErrorHandler)2 为这个错误所做的事情。
如图所示,代码要求打开一个文件,但该文件根本就不存在,于是Python便打印出了这个错误。这便是Python中的异常。
那么我们知道Python中因为各种原因会出现异常,这里就又引出了另一个问题,都有那些异常呢?这个问题直接影响我们处理异常的方式。下面为大家整理了Python中常见的异常以及他们所表示的意思
0.BaseException 所有异常的基类。
1.SystemExit 解释器请求退出。
2.KeyboardInterrupt 用户终端执行(通常是输入)。
3.GeneratorExit生成器发生异常来通知退出。
4.StandardError 所有内建标准异常的基类。
5.Exception 常规错误的基类
1)StopIteration 迭代器没有更多的值
2)ArithmeticError 所有数值计算错误的基类
①FloatingPointError 浮点计算错误
②OverflowError数值运算超出最大限制
③ZeroDivisionError 除(或取模)零(所有数据类型)
3)AssertionError 断言语句失败
4)AttributeError 对象没有这个属性
5)BufferError 缓存错误
6)EOFError 没有内建输入,到达EOF标记
7)EnvironmentError 操作系统错误的基类
8)IOError 输入/输出操作失败
9)LookupError 无效数据查询的基类
①IndexError 序列中没有此索引
②KeyError 映射中没有这个键
10)MemoryError 内存溢出错误(对于Python解释器不是致命的)
11)NameError 未声明/初始化对象(没有属性)
①UnboundLocalError 访问未初始化的本地变量
12)OSError 操作系统错误
13)WindowsError 系统调用失败
14)ReferenceError 弱引用试图访问已经垃圾回收了的对象
15)RuntimeError 一般的运行时错误
①NotImplementedErrro 尚未实现的方法
16)SyntaxError 语法错误
①IndentationError 缩进错误
a.TabError 空格和Tab混用
17)SystemError 一般的解释器系统错误
18)TypeError 对类型无效的操作
19)ValueError 传入无效的参数
①UnicodeError Unicode相关的错误
a.UnicodeDecodeError 解码时错误
b.UnicodeEncodeError编码时错误
c.UnicodeTranslaterror 转换时错误
20)Warning
①DeprecationgWarning 关于被弃用的特征的警告
②PendingDeprecationgWarning 关于特性将会被废弃的警告
③RuntimeWarning 可疑的运行时行为
④SyntaxWaring 可疑的语法警告
⑤UserWarning 用户代码生成的警告
⑥FutureWaring 关于构造将来语义会有改变的警告
21.AssertionError 断言语句(assert)失败
22.AttributeError 尝试访问未知的对象属性
23.EOFError 用户输入文件末尾标志EOF(Ctrl+d)
24.FloatingPointError 浮点计算错误
25.GeneratorExit generator.close()方法被调用的时候
26.ImportError 导入模块失败的时候
27.IndexError 索引超出序列的范围
28.KeyError 字典中查找一个不存在的关键字
29.KeyboardInterrupt 用户输入中断键(Ctrl+c)
30.MemoryError 内存溢出(可通过删除对象释放内存)
31.NameError 尝试访问一个不存在的变量
32.NotImplementedError 尚未实现的方法
33.OSError 操作系统产生的异常(例如打开一个不存在的文件)
34.OverflowError 数值运算超出最大限制
35.ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
36.RuntimeError 一般的运行时错误
37.StopIteration 迭代器没有更多的值
38.SyntaxError Python的语法错误
39.IndentationError 缩进错误
40.TabError Tab和空格混合使用
41.SystemError Python编译器系统错误
42.SystemExit Python编译器进程被关闭
43.TypeError 不同类型间的无效操作
44.UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
45.UnicodeError Unicode相关的错误(ValueError的子类)
46.UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
47.UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
48.UnicodeTranslateError Unicode转换时的错误(UnicodeError的子类)
49.ValueError 传入无效的参数
50.ZeroDivisionError 除数为零
那么Python中我们会使用try/except语句来处理异常
下面是其使用的语法格式
try: 检测范围 except Exception[as reason]: 出现异常后的处理代码
try的工作原理是,当开始的一个try语句后,Python就在当前程序的上下文中做标记,这样当异常出现时就可以回到这里,try子句先执行。如果当try后的语句执行时发生异常,Python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。如果try语句中发生异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
那么我们可以看到上图中的异常处理,try语句中的代码要求打开一个不存在的文件,那么文件不存在无法打开,如果不做异常处理Python中错误处理器将用英文打印出程序执行时的错误,但这里我们做了异常处理,使得发生对应异常后按照我们设定的处理方式处理,图中便是向用户打印“文件不存在鸭QAQ”的提示语,当然也可以是其它。
值得注意的是我们同样可以通过as reason将错误的参数也打印出来。下面是加上as reason的情况
当然 reason只是我们设定的一个变量名,我们同样可以将其设置为其它名字,但打印它是需要注意
它是一个错误代码,打印时需要将其强制转换为字符串。
那如果程序中存在很多我们不知道的异常时怎么办呢?我们无法对应写出全部的错误类型来处理,那么我们就可以直接用一个except语句来将所有异常用一个方式来处理。这种情况except后不用跟上异常的类型。
try/finally语句在使用时也常常会有except语句联合使用。其语法格式如下:
try: 检测范围 except Exception[as reason]: 出现异常后的处理代码 finally: 无论如何都会被执行的代码
相信大家从代码块中也明白了finally语句的作用,没错finally是异常处理当中必须被执行的代码,那什么情况我们会使用到finally呢?举个例子
如果异常发生在文件被打开之后,那么出现异常时程序便跳转到except语句中,此时文件是没有被关闭的。如果我们有写入东西到文件,但文件并没有被关闭,我们所写入的内容将一直存放在缓存区中无法进入文件,此时就需要用到finally语句了,只需要关闭语句写入到finally中,无论发生什么文件最后都会被关闭,那么我们就不用担心白忙活了。(●’◡’●)
我们的程序中出现异常其实是非常常见的事,因为我们在编写程序的时候往往不能考虑的非常全面,用户在运行程序的时候也不会完完全全按照我们所想的方式去输入,那么这就会导致异常出现了,但异常的处理是相对简单的,我们只需要结合相对应的异常类型,写入相关的处理方式也可以使程序较好的运行不至于崩溃,同时也可以给予用户更好的体验。所有异常的处理是我们必须去做必须要会的内容。希望本文可以帮助到正在学习python的程序猿们,我们共同进步!