Python异常处理
1|0一、异常和错误
1|11.1 程序中难免出现错误,而错误分成两种
1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)

2.逻辑错误(逻辑错误)

1|21.1 什么是异常
异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下:
1|31.3 python中的异常种类
在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误
1.3.1 触发IndexError
1.3.2 触发KeyError
1.3.3 触发ValueError
1.3.4 常用异常
1.3.5 更多异常

2|0二、异常处理
2|12.1 什么是异常
异常发生之后
异常之后的代码就不执行了
2|22.2 什么是异常处理
python解释器检测到错误,触发异常(也允许程序员自己触发异常)
程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)
如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理
2|32.3 为什么要进行异常处理?
python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件。
所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性
2|42.4 如何进行异常处理?
首先须知,异常是由程序的错误引起的,语法上的错误跟异常处理无关,必须在程序运行前就修正
2.4.1 使用if判断式
-
总结:
1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。
2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差
3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。
2.4.2 python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理
part1:基本语法
读文件例子
-
part2:异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
part3:多分支
part4:万能异常 在python的异常中,有一个万能异常:Exception,他可以捕获任意异常,即:
你可能会说既然有万能异常,那么我直接用上面的这种形式就好了,其他异常可以忽略
你说的没错,但是应该分两种情况去看
1.如果你想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么骚年,大胆的去做吧,只有一个Exception就足够了。
2.如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。
多分支+Exception
part5:异常的其他机构
part6:主动触发异常
part7:自定义异常
part8:try..except的方式比较if的方式的好处
try..except这种异常处理机制就是取代if那种方式,让你的程序在不牺牲可读性的前提下增强健壮性和容错性
异常处理中为每一个异常定制了异常类型(python中统一了类与类型,类型即类),对于同一种异常,一个except就可以捕捉到,可以同时处理多段代码的异常(无需‘写多个if判断式’)减少了代码,增强了可读性
使用try..except的方式
1:把错误处理和真正的工作分开来
2:代码更易组织,更清晰,复杂的工作任务更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;
3|0三 什么时候用异常处理
有的同学会这么想,学完了异常处理后,好强大,我要为我的每一段程序都加上try...except,干毛线去思考它会不会有逻辑错误啊,这样就很好啊,多省脑细胞。
try...except应该尽量少用,因为它本身就是你附加给你的程序的一种异常处理的逻辑,与你的主要的工作是没有关系的
这种东西加的多了,会导致你的代码可读性变差,只有在有些异常无法预知的情况下,才应该加上try...except,其他的逻辑错误应该尽量修正
4|0四、断言
“断言”是一个心智正常的检查,确保代码没有做什么明显错误的事情。这些心智正常的检查由 assert 语句执行。如果检查失败,就会抛出异常。在代码中,assert语句包含以下部分:
- assert 关键字;
- 条件(即求值为 True 或 False 的表达式);
- 逗号;
- 当条件为 False 时显示的字符串。
例如,在交互式环境中输入以下代码:
这里将 podBayDoorStatus 设置为 'open',所以从此以后,我们充分期望这个变量的值是 'open'。在使用这个变量的程序中,基于这个值是 'open' 的假定,我们可能写下了大量的代码,即这些代码依赖于它是 'open',才能按照期望工作。所以添加了一个断言,确保假定 podBayDoorStatus 是 'open' 是对的。这里,我们加入了信息 'Thepod bay doors need to be "open".',这样如果断言失败,就很容易看到哪里出了错。稍后,假如我们犯了一个明显的错误,把另外的值赋给 podBayDoorStatus,但在很多行代码中,我们并没有意识到这一点。这个断言会抓住这个错误,清楚地告诉我们出了什么错。在日常英语中,assert 语句是说:“我断言这个条件为真,如果不为真,程序中什么地方就有一个缺陷。”不像异常,代码不应该用 try 和 except 处理 assert 语句。如果assert 失败,程序就应该崩溃。通过这样的快速失败,产生缺陷和你第一次注意到该缺陷之间的时间就缩短了。这将减少为了寻找导致该缺陷的代码,而需要检查的代码量。断言针对的是程序员的错误,而不是用户的错误。对于那些可以恢复的错误(诸如文件没有找到,或用户输入了无效的数据),请抛出异常,而不是用assert 语句检测它。
在交通灯模拟中使用断言
假定你在编写一个交通信号灯的模拟程序。代表路口信号灯的数据结构是一个字典,以 'ns' 和 'ew' 为键,分别表示南北向和东西向的信号灯。这些键的值可以是 'green'、'yellow' 或 'red' 之一。代码看起来可能像这样:
这两个变量将针对 Market 街和第 2 街路口,以及 Mission 街和第 16 街路口。作为项目启动,你希望编写一个 switchLights() 函数,它接受一个路口字典作为参数,并切换红绿灯。开始你可能认为,switchLights() 只要将每一种灯按顺序切换到下一种顔色:'green' 值应该切换到 'yellow','yellow' 应该切换到 'red','red' 应该切换到'green'。实现这个思想的代码看起来像这样:
你可能已经发现了这段代码的问题,但假设你编写了剩下的模拟代码,有几千行,但没有注意到这个问题。当最后运行时,程序没有崩溃,但虚拟的汽车撞车了!因为你已经编写了剩下的程序,所以不知道缺陷在哪里。也许在模拟汽车的代码中,或者在模拟司机的代码中。可能需要花几个小时追踪缺陷,才能找到switchLights() 函数。但如果在编写 switchLights() 时,你添加了断言,确保至少一个交通灯是红色,可能在函数的底部添加这样的代码:
有了这个断言,程序就会崩溃,并提供这样的出错信息:
这里重要的一行是 AssertionError。虽然程序崩溃并非如你所愿,但它马上指出了心智正常检查失败:两个方向都没有红灯,这意味着两个方向的车都可以走。在程序执行中尽早快速失败,可以省去将来大量的调试工作。
禁用断言
在运行 Python 时传入-O 选项,可以禁用断言。如果你已完成了程序的编写和测试,不希望执行心智正常检测,从而减慢程序的速度,这样就很好(尽管大多数断言语句所花的时间,不会让你觉察到速度的差异)。断言是针对开发的,不是针对最终产品。当你将程序交给其他人运行时,它应该没有缺陷,不需要进行心智正常检查。
5|0五、其它(assertpy)
python自带的Assert功能并不尽人意,可用测试框架的断言机制,比如pytest的或者是unittest的等等。
还可以用assert包。强烈推荐assertpy 这个包,它异常强大而且好评如潮。它的 github主页:https://github.com/ActivisionGameScience/assertpy
它支持了几乎你能想到的所有测试场景,包括但不限于以下列表。
-
Strings
-
Numbers
-
Lists
-
Tuples
-
Dicts
-
Sets
-
Booleans
-
Dates
-
Files
-
Objects
而且它的断言信息简洁明了,不多不少。
5|1安装
5|2类型判断
5|3常用
5|4编码
5|5是否含有部分字符或子字符串
5|6是否含有重复字符
5|7是否属于几个字符串中的一个,或者大字符串的部分字符串
5|8匹配正则
5|9匹配数字
5|10整数
整数类型判断
整数0正负判断
整数是否等于判断
整数 区间、大小判断
整数是否属于判断
5|11浮点数
浮点数类型判断
浮点数是否等于判断
浮点数区间、大小判断
5|12nan和inf
5|13列表
5|14自己写错误原因
__EOF__

本文链接:https://www.cnblogs.com/dongye95/p/10264181.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!