异常

1.异常简介

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。

一般情况下,在Python无法正常处理程序时就会发生一个异常。

异常是Python对象,表示一个错误。

当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。

看如下示例:

异常_第1张图片
运行结果:
异常_第2张图片

说明:

打开一个不存在的文件123.txt,当找不到123.txt文件时,就会抛出给我们一个IOError类型的错误,No such file or directory:123.txt(没有123.txt这样的文件或目录)

异常:

当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"

2.捕获异常

1.捕获异常try...except...

异常_第3张图片

运行结果:

说明:

·此程序看不到任何错误,因为用except捕获到了IOError异常,并添加了处理的方法

·pass表示实现了相应的实现,但什么也不做;如果把pass改为print语句,那么就会输出其他信息

小总结:

异常_第4张图片

·把可能出现问题的代码,放在try中

·把处理异常的代码,放在except中

2.python异常处理

BaseException            所有异常的基类

SystemExit                  解释器请求退出

KeyboardInterrupt        用户中断执行(通常是输入^C)

Exception                    常规错误的基类

StopIteration                迭代器没有更多的值

GeneratorExit               生成器(generator)发生异常来通知退出

StandardError               所有的内建标准异常的基类

ArithmeticError              所有数值计算错误的基类

FloatingPointError          浮点计算错误

OverflowError                数值运算超出最大限制

ZeroDivisionError            除(或取模)零 (所有数据类型)

AssertionError                 断言语句失败

AttributeError                  对象没有这个属性

EOFError                        没有内建输入,到达EOF 标记

EnvironmentError             操作系统错误的基类

IOError                           输入/输出操作失败

OSError                          操作系统错误

WindowsError                 系统调用失败

ImportError                     导入模块/对象失败

LookupError                    无效数据查询的基类

IndexError                       序列中没有此索引(index)

KeyError                         映射中没有这个键

MemoryError                   内存溢出错误(对于Python 解释器不是致命的)

NameError                       未声明/初始化对象 (没有属性)

UnboundLocalError           访问未初始化的本地变量

ReferenceError                 弱引用(Weak reference)试图访问已经垃圾回收了的对象

RuntimeError                     一般的运行时错误

NotImplementedError         尚未实现的方法

SyntaxErrorPython             语法错误

IndentationError                 缩进错误

TabErrorTab                     和空格混用

SystemError                      一般的解释器系统错误

TypeError                          对类型无效的操作

ValueError                         传入无效的参数

UnicodeErrorUnicode           相关的错误

UnicodeDecodeErrorUnicode  解码时的错误

UnicodeEncodeErrorUnicode  编码时错误

UnicodeTranslateErrorUnicode 转换时错误

Warning                                  警告的基类

DeprecationWarning                关于被弃用的特征的警告

FutureWarning                         关于构造将来语义会有改变的警告

OverflowWarning                     旧的关于自动提升为长整型(long)的警告

PendingDeprecationWarning     关于特性将会被废弃的警告

RuntimeWarning                      可疑的运行时行为(runtime behavior)的警告

SyntaxWarning                        可疑的语法的警告

UserWarning                           用户代码生成的警告

3.except捕获多个异常


4.获取异常的信息描述

异常_第5张图片
异常_第6张图片

5.捕获所有异常

异常_第7张图片
异常_第8张图片

6.else

在if中,它的作用是当条件不满足时执行的实行;同样在try...except...中也是如此,即如果没有捕获到异常,那么就执行else中的事情

异常_第9张图片
运行结果:

7.try...finally...

try...finally...语句用来表达这样的情况:

在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等

异常_第10张图片
运行结果:


说明:

test.txt文件中每一行数据打印,但是我有意在每打印一行之前用time.sleep方法暂停2秒钟。这样做的原因是让程序运行得慢一些。在程序运行的时候,按Ctrl+c中断(取消)程序。

我们可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执行,把文件关闭。

3.异常的传递

1.try嵌套中

异常_第11张图片
运行结果:

2.函数嵌套调用中

异常_第12张图片

运行结果:

异常_第13张图片

总结:

·如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。

·如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样

·注意观察上图中,当调用test3函数时,在test1函数内部产生了异常,此异常被传递到test3函数中完成了异常处理,而当异常处理完后,并没有返回到函数test1中进行执行,而是在函数test3中继续执行

4.抛出自定义的异常

你可以用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类

异常_第14张图片
运行结果:

1.

2.

3.

注意

以上程序中,关于代码#super().__init__()的说明

这一行代码,可以调用也可以不调用,建议调用,因为__init__方法往往是用来对创建完的对象进行初始化工作,如果在子类中重写了父类的__init__方法,即意味着父类中的很多初始化工作没有做,这样就不保证程序的稳定了,所以在以后的开发中,如果重写了父类的__init__方法,最好是先调用父类的这个方法,然后再添加自己的功能

5.异常处理中抛出异常

异常_第15张图片
运行结果:
异常_第16张图片

你可能感兴趣的:(异常)