这个Python异常处理总结居然是一个刚入职半个月的实习生写的!

这个Python异常处理总结居然是一个刚入职半个月的实习生写的!

2 异常类型

Python自带的异常处理机制非常强大,提供了很多内置异常类,可向用户准确反馈出错信息。Python是面向对象语言,认为一切皆对象,所以异常也是对象。Python异常处理机制中的BaseException是所有内置异常的基类,但用户定义的类并不直接继承BaseException,所有的异常类都是从Exception继承,且都在exceptions模块中定义。Python自动将所有异常名称放在内建命名空间中,所以程序不必导入exceptions模块即可使用异常。

私信菜鸟007送你全套教程!

Python内置异常类继承层次结构如下:

BaseException # 所有异常的基类
 +-- SystemExit # 解释器请求退出
 +-- KeyboardInterrupt # 用户中断执行(通常是输入^C)
 +-- GeneratorExit # 生成器(generator)发生异常来通知退出
 +-- Exception # 常规异常的基类
 +-- stopiteration # 迭代器没有更多的值
 +-- StopAsyncIteration # 必须通过异步迭代器对象的__anext__()方法引发以停止迭代
 +-- ArithmeticError # 各种算术错误引发的内置异常的基类
 | +-- FloatingPointError # 浮点计算错误
 | +-- OverflowError # 数值运算结果太大无法表示
 | +-- ZeroDivisionError # 除(或取模)零 (所有数据类型)
 +-- AssertionError # 当assert语句失败时引发
 +-- AttributeError # 属性引用或赋值失败
 +-- BufferError # 无法执行与缓冲区相关的操作时引发
 +-- EOFError # 当input()函数在没有读取任何数据的情况下达到文件结束条件(EOF)时引发
 +-- ImportError # 导入模块/对象失败
 | +-- ModuleNotFoundError # 无法找到模块或在在sys.modules中找到None
 +-- LookupError # 映射或序列上使用的键或索引无效时引发的异常的基类
 | +-- IndexError # 序列中没有此索引(index)
 | +-- KeyError # 映射中没有这个键
 +-- MemoryError # 内存溢出错误(对于Python 解释器不是致命的)
 +-- NameError # 未声明/初始化对象 (没有属性)
 | +-- UnboundLocalError # 访问未初始化的本地变量
 +-- OSError # 操作系统错误,EnvironmentError,IOError,WindowsError,socket.error,select.error和mmap.error已合并到OSError中,构造函数可能返回子类
 | +-- BlockingIOError # 操作将阻塞对象(e.g. socket)设置为非阻塞操作
 | +-- ChildProcessError # 在子进程上的操作失败
 | +-- ConnectionError # 与连接相关的异常的基类
 | | +-- brokenPipeError # 另一端关闭时尝试写入管道或试图在已关闭写入的套接字上写入
 | | +-- ConnectionAbortedError # 连接尝试被对等方中止
 | | +-- ConnectionRefusedError # 连接尝试被对等方拒绝
 | | +-- ConnectionResetError # 连接由对等方重置
 | +-- FileExistsError # 创建已存在的文件或目录
 | +-- FileNotFoundError # 请求不存在的文件或目录
 | +-- InterruptedError # 系统调用被输入信号中断
 | +-- IsADirectoryError # 在目录上请求文件操作(例如 os.remove())
 | +-- NotADirectoryError # 在不是目录的事物上请求目录操作(例如 os.listdir())
 | +-- PermissionError # 尝试在没有足够访问权限的情况下运行操作
 | +-- ProcessLookupError # 给定进程不存在
 | +-- TimeoutError # 系统函数在系统级别超时
 +-- ReferenceError # weakref.proxy()函数创建的弱引用试图访问已经垃圾回收了的对象
 +-- RuntimeError # 在检测到不属于任何其他类别的错误时触发
 | +-- NotImplementedError # 在用户定义的基类中,抽象方法要求派生类重写该方法或者正在开发的类指示仍然需要添加实际实现
 | +-- RecursionError # 解释器检测到超出最大递归深度
 +-- SyntaxError # Python 语法错误
 | +-- IndentationError # 缩进错误
 | +-- TabError # Tab和空格混用
 +-- SystemError # 解释器发现内部错误
 +-- TypeError # 操作或函数应用于不适当类型的对象
 +-- ValueError # 操作或函数接收到具有正确类型但值不合适的参数
 | +-- UnicodeError # 发生与Unicode相关的编码或解码错误
 | +-- UnicodeDecodeError # Unicode解码错误
 | +-- UnicodeEncodeError # Unicode编码错误
 | +-- UnicodeTranslateError # Unicode转码错误
 +-- Warning # 警告的基类
 +-- DeprecationWarning # 有关已弃用功能的警告的基类
 +-- PendingDeprecationWarning # 有关不推荐使用功能的警告的基类
 +-- RuntimeWarning # 有关可疑的运行时行为的警告的基类
 +-- SyntaxWarning # 关于可疑语法警告的基类
 +-- UserWarning # 用户代码生成警告的基类
 +-- FutureWarning # 有关已弃用功能的警告的基类
 +-- ImportWarning # 关于模块导入时可能出错的警告的基类
 +-- UnicodeWarning # 与Unicode相关的警告的基类
 +-- BytesWarning # 与bytes和bytearray相关的警告的基类
 +-- ResourceWarning # 与资源使用相关的警告的基类。被认警告过滤器忽略。

3 异常捕获与处理

当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。使用Python异常处理机制时,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。Python异常处理机制常用的几种异常捕获和处理结构如下:

第一种:try - except

try:
 <语句>
except:
 <异常处理>

这种结构使用简单,但可能会引发一些设计问题:尽管使用方便,但可能捕获与程序无关、意料之外的系统异常,而且可能意外拦截其他处理器的异常。例如,在Python中,即表示系统离开调用(sys.exit())也会出发异常,然而这种异常我们通常不需要捕获。所以,这种结构尽量少用。

import time
import sys
try:
 while True:
 a = int(input('请输入一个数字:'))
 if a==0:
 sys.exit()
 else:
 print('您输入的数字是:{}'.format(a))
 time.sleep(1)
except:
 print('发生异常了……')

输入数字0时,输出如下:

请输入一个数字:0

发生异常了……

事实上,系统知识正常退出,并不算异常,但是只使用except,Python会将系统离开调用当做异常来捕获。

(2)try-except<异常名>

try:
 <语句>
 except <异常名> [as e]:
 <异常处理>

except中,as e是可选的,意思是将捕获的异常类实例化对象赋值给e(当然也可以用其他变量名),在except下面的代码块中,我们将可以通过这个e访问异常实例化对象中的方法和数据。另外,except子句的个数理论上是不限的,不过不能将父类置于子类前面。在上文中提到,Exception类是所有Python异常类的父类,所以except Exception将可以捕获任何异常,换句话说,它是万能异常处理句式。

try:
 a = int(input('请输入一个数字:'))
except ValueError as e:
 print(e)

当输入一个非数字类字符时,输出如下:

请输入a的值:j

invalid literal for int() with base 10: 'j'

如果输入b的值为0,输出如下:

请输入a的值:1

请输入b的值:0

division by zero

(3)try-except (<异常类1>,<异常类2>,...)

try:
 <语句>
except (<异常类1>,...):
 <异常处理>
try:
 a = int(input('请输入a的值:'))
 b = int(input('请输入b的值:'))
 c = a/b
except (ValueError,ZeroDivisionError) as e:
 print(e)

当输入一个非数字类字符时,输出如下:

请输入a的值:j

invalid literal for int() with base 10: 'j'

如果输入b的值为0,输出如下:

请输入a的值:1

请输入b的值:0

division by zero

(4)try-except-else

try:
 <语句>
except <异常名>:
 <异常处理>
else:
 <语句> # try语句中没有异常则执行此段代码

如果说except是在try中代码抛出异常时执行,那么else语句下面的代码将在try顺利执行(没有抛出任何异常)的情况下才会执行。

try:
 a = int(input('请输入a的值:'))
 b = int(input('请输入b的值:'))
 c = a/b
except (ValueError,ZeroDivisionError) as e:
 print(e)
else:
 print('a/b的结果为:{}'.format(c))

当输入a和b的值都为数字时,才会执行else部分代码输出结果如下:

请输入a的值:4

请输入b的值:2

a/b的结果为:2.0

(5)try-except-finally

try:
 <语句>
except <异常类>:
 <异常处理>
finally:
 <语句> # 不管try中代码是否抛出异常,都会执行此段代码

finally中的代码无论try中代码是否抛出异常都会执行。

try:
 a = int(input('请输入a的值:'))
 b = int(input('请输入b的值:'))
 c = a/b
except (ValueError,ZeroDivisionError) as e:
 print(e)
else:
 print('a/b的结果为:{}'.format(c))
finally:
 print('无论你输入什么值,finally都会执行……')

4 主动抛出异常(raise)

有时候,异常可以作为代码运行的标志,通过主动触发异常可以改变代码的运行路线,从而提高代码健壮性。主动触发异常需使用raise关键字,其语法结构如下:

进群:960410445  即可获取数十套PDF!

 raise [Exception [,args [,traceback]]]
def fun(x,y):
 try:
 print('fun()方法开始执行……')
 if isinstance(x,int) and isinstance(y,int):
 return x+y
 else:
 raise TypeError('类型错误')
 except Exception as e:
 print(e)
 finally:
 print('fun()方法执行结束……')
fun(2,'3')

输出结果:

fun()方法开始执行……

类型错误

fun()方法执行结束……

5 断言(assert)

assert语句根据后面的表达式的真假来控制程序流。 asset语法结构如下:

assert expression,'information'

若为expression结果为True,则往下执行。若为False,则中断程序并调用认的异常处理器抛出AssertionError异常,同时输出指定的提示信息。

def fun(x):
 print('fun()方法开始执行……')
 assert x<0,'抛出异常,x小于0'
 print('fun()方法执行结束……')
try:
 fun(2)
except Exception as e:
 print(e)

输出结果:

fun()方法开始执行……

抛出异常,x小于0

可以发现,打印输出第一行语句之后,由于断言失败,抛出异常,程序直接退出

6 with/as上下文管理器

with/as语句通常是作为try/finally语句的替代方案,不过with/as更加优雅。在有一些任务中,可能事先需要设置,然后不管在任务过程中是否顺利(有无异常抛出),最后后做清理工作。对于这种场景, with/as语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读写数据,但不管读写数据是否有异常发生,最后都要关闭文件句柄。

with/as语句的基本格式如下:

with expression [as variable] :
 with-block

在这里的expression会返回一个对象,as子句是可选的,当存在as子句时,expression返回的对象会赋值给variable。

使用with/as语句将一段字符串写入文件

with open('data.txt','w') as myfile:
 myfile.write('123456789')
 不适用with/as语句,如果要实现同样的效果,只能这么写:
try:
 myfile = open('data.txt','w')
 myfile.write('123456789')
except Exception as e:
 print(e)
finally:
 myfile.close()

7 自定义异常类

如果Python提供的内置异常内不满足使用要求,那么,可以自定义一个异常类。自定义异常类必须继承Exception类,并且在使用时,必须通过raise关键字自动触发。

class MyError(Exception):
 def __init__(self,info):
 self.info = info
 def __str__(self):
 return '{}:{}'.format(self.__class__ .__name__,self.info)
try:
 raise MyError('自定义的异常……')
except MyError as e :
print(e)

输出结果:

MyError:自定义的异常……

8 总结

本文是对Python异常处理机制的总结,较为全面的介绍了Python异常处理的常用内置类,即几种异常捕获/处理句式结构,主动触发异常,断言,with上下文管理协议,自定义异常类等内容

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实