python异常机制
异常是什么?
软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是Exception,意思是例外。遇到这些例外情况,或者交异常,我们怎么让写的程序做出合理的处理,安全的退出,而不至于程序崩溃呢?
工作中,程序遇到的情况不可能完美。比如:程序要打开某个文件,这个文件肯能不存在或者文件格式不对;程序在运行着,但是内存或者硬盘可能满了等等
异常的本质
当程序出现异常,程序安全的退出、处理完后继续执行的机制
python中,引入了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法,下面较为完整的展示了python中内建异常类的继承层次;

我们处理一下,遇到的第一个异常
# 测试简单的0不能做除数
a = 3 / 0

python中一切都是对象,异常也采用对象的方式来处理。处理过程:
- 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器
- 捕获异常:解释器得到该异常后,寻找相应的代码处理该异常
异常的解决思路
解决异常问题的态度
- 学习完异常相关知识点,知识开始对异常有些认识,不以为着你会调试任何异常;
- 异常调制,需要大量的经验作为基础。因此,大家不要再次停留,继续往后学习。碰到每个异常,都要化心思去解决而不要动不动张口问人。通过自己的女里无法解决,再去找老师同学帮组解决。
解决每一个遇到的异常,建议大家遵循如下三点:
- 不慌张,细看信息,定义错误。看清楚报的错误信息,并定位发生错误的地方
- 百度并查看十个相关帖子。将异常类信息极性百度,至少查看十个以上的相关帖子
- 以上两步仍然无法解决,找老师和同学协助解决
异常的解决的关键:定位
def a():print("run in a() start!")num = 1 / 0print("run in a() end!")def b():print("run in b() start!")a()print("run in b() end!")def c():print("run in c() start!")b()print("run in c() end!")print("step1")
c()
print("step2")

当发生异常时,解释器会报相关的错误信息,并会在控制台打印相关错误信息。我们只需要按照从上到下的顺序即可追溯(trackback)错误发生的过程,最终定位引起错误的哪一行代码。
try和except结构
try...一个except结构
try:
被监控的可能引发异常的语句块
except BaseException[as e]:
异常处理语句块
try:print("step1")a = 3 / 0print("step2")except BaseException as e:print("step3")print(e)
print("step4")
print("step5")

- try块包含着可能引发异常的代码,except块则用来捕捉和处理发生的异常
- 执行的时候,如果try块没有引发异常,则跳过except块继续执行后续代码;
- 执行的时候,如果try块中发生了一场,则跳过try块中的后续代码,跳到相应的except块中处理异常;异常处理完后,继续执行后续代码。
while True:try:x = int(input("请输入一个数字:"))print("您输入的数字是:", x)if x == 88:print("退出程序")breakexcept BaseException as e:print("异常,输入的不是数字!")print(e)

try...多个except结构
上面的结构可以捕获所有的异常,工作中也很常见。但是,从经典理论考虑,一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代码,为了避免遗漏可能出现的异常,可能在最后增加BaseException。结构如下:
try:
被监控的、可能引发异常的语句块
except Exception1:
处理Exception1的语句块
except Exception2:
处理Exception2的语句块
[...]
except BaseException:
处理可能遗漏的异常的语句块
try:a=input("请输入被除数:")b=input("请输入除数:")c=float(a)/float(b)print(c)except ZeroDivisionError:print("异常:除数不能为0")
except TypeError:print("异常:除数和被除数都应该为数值类型")
except BaseException as e:print(e)print(type(e))
try...except...else结构
try...except...else结构增加了else块。如果try块中没有抛出异常,则执行else块。如果try块中抛出异常,则执行except块,不执行else块
try:a = input("请输入被除数")b = input("请输入除数:")c = float(a) / float(b)
except BaseException as e:print(e)
else:print("除的结果是:", c)
try...except...finally结构
try...except...finally结构中,finally块无论是否发生异常都会被执行;通常用来释放try块中申请的资源。
try:a = input("请输入被除数:")b = input("请输入除数:")c = float(a) / float(b)
except BaseException as e:print(e)
else:print("除的结果是:", c)
finally:print("我是finally语句,无论是否发生异常,我都会被执行!!!")
print("程序执行结束")

a只有当捕捉到,才会实例成对象,可以尝试打印print(a),会发现,它的打印结果是一串字符串,所以一定是使用了__str__的魔术方法,所以想要按照各个错误类型,去执行,就要通过a.__str__()的方法实现执行,如下图
try:# f = open('a.txt', "r")f = open("b.txt", 'r')content = f.read()print(content)
except BaseException as e:print(e)print(type(e))
finally:print("关闭文件")try:f.close()except BaseException as a:if a.__str__()=="name 'f' is not defined":print("a 没有被定义成功,不用关闭")print("继续执行其他代码")
print("程序结束")

常见异常汇总
python中的异常都是派生自BaseException类,本节我们测试和列出常见的一些异常,方便初学者掌握。
SyntaxError:语法错误
int a =3
^
SyntaxError: invalid syntax
NameError:尝试访问一个没有申请的变量
print(a)
NameError: name 'a' is not defined
ZeroDivisionError:除数为0错误(零除错误)
a=3/0
ZeroDivisionError: division by zero
ValueError:数值错误
a=float("laogao")
ValueError: could not convert string to float: 'laogao'
TypeError:类型错误
a=123+"abc"
TypeError: unsupported operand type(s) for +: 'int' and 'str'
AttributeError:访问对象不存在的属性
a=100
a.sayhi()
AttributeError: 'int' object has no attribute 'sayhi'
IndexError:索引越界异常
a=[4,5,6]
a[10]
IndexError: list index out of range
KeyError:字典的关键字不存在
a={'name':"laogao",'age':18}
a['salary']
KeyError: 'salary'
with上下文管理

finally块由于是否发生异常都会执行,通常我们释放资源的代码。其实,我们可以通过
with上下文管理,更方便的视线释放资源的操作。
with上下文管理的语法结构如下:
with context_expr [ as var]:
语句块
with上下文管理可以自动管理资源,在with代码块执行完毕后自动还原进入改代码之前的现场或上下文。不论何种原因跳出with块,不论是否有异常,总能保证资源正常释放。极大地简化了工作,怎文件操作、网络通信相关的场合非常常用。
with open("a.txt") as f:# content=f.readline() 打印一行信息# print(content)#打印多行信息使用for循环for line in f:print(line,end='')
traceback模块和生成异常日志
import tracebacktry:print("step1")num = 1 / 0
except:with open("c.log", "a") as f: # appendtraceback.print_exc(file=f)print("打印成功")
自定义异常类
程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常继承Exception或其子类即可。命名一般以Error、Exception为后缀
自定义异常有raise语句主动抛出。
# 自定义异常类
class AgeError(Exception):def __init__(self, errorInfo):Exception.__init__(self)self.errorInfo = errorInfodef __str__(self):return str(self.errorInfo) + ",年龄错误!应该在1-150之间"if __name__ == "__main__":age = int(input("请输入一个年龄:"))if ((age < 1) or (age > 150)):raise AgeError(age)else:print("正常的年龄:", age)
Pycharm开发环境的调试(debug)
- 进行调试的核心是设置断点。
- 程序执行到断点时,暂时挂起,停止执行。就像看视频按下停止一样,可以详细观看停止处的每一个细节。
断点
程序运行到此处,暂时挂起,停止执行。我们可以详细在此时观察程序的运行情况,方便做出进一步的判断。
- 设置断点:
在行号后面单击即可增加断点,在断点上再单击即可取消断点

进入调试视图
我们通过如下三种方式都可以进入调试视图:
- 单击工具栏上的按钮

- 右键单击编辑区,点击:debug‘模块名’

- 快捷键:shift+F9
进入调试视图后,布局如下:

- 左侧为“浏览帧”:
调试器流出断点处,当前线程正在运行的方法,每个方法对应一个“栈帧”。最上面的是当前断点所处的方法。 - 变量观察区:
- 调试器列出了断点处所在的方法相关的变量值。我们可以通过它,查看变量的值的变化。
调试操作区

如果不管一个方法如何运行,只想看结果想直接跳过,就点击这个按钮,Step Over,或者是按F8

此时断点还在a方法中运行,如果想进入b方法就要按下面画圈的按钮,或者按F7,就能进入函数,查看b函数当中的变量。

相关文章:
python异常机制
异常是什么? 软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是Exception,意思是例外。遇到这些例外情况,或者交异常,我们怎么让写的程序做出合理的处理,…...
运行爬虫时可能遇到哪些常见问题?
在运行Python爬虫时,可能会遇到以下一些常见问题及相应的解决方法: 1. 请求频繁被封 IP 问题描述:爬虫请求频繁时,网站可能会识别到异常行为并封禁 IP,从而导致后续请求失败。解决方法: 使用代理…...
BGP与CN2的区别 详解两者在网络传输中的应用与优势
在现代互联网环境中,选择合适的网络传输协议和解决方案对于企业的业务运行至关重要。BGP(Border Gateway Protocol)和CN2(China Telecom Next Carrier Network)是两种广泛应用的网络技术,但它们的设计理念、…...
Spring 项目 基于 Tomcat容器进行部署
文章目录 一、前置知识二、项目部署1. 将写好的 Spring 项目先打包成 war 包2. 查看项目工件(Artifact)是否存在3. 配置 Tomcat3.1 添加一个本地 Tomcat 容器3.2 将项目部署到 Tomcat 4. 运行项目 尽管市场上许多新项目都已经转向 Spring Boot࿰…...
“负载均衡”出站的功能、原理与场景案例
在企业日常网络中,外网访问速度不稳定是一个常见问题。特别是多条外网线路并行时,不合理的流量分配会导致资源浪费甚至网络拥堵。而出站负载均衡,正是解决这一问题的关键技术。 作为一种先进的网络流量管理技术,其核心是优化企业内…...
02-51单片机数码管与矩阵键盘
一、数码管模块 1.数码管介绍 如图所示为一个数码管的结构图: 说明: 数码管上下各有五个引脚,其中上下中间的两个引脚是联通的,一般为数码管的公共端,分为共阴极或共阳极;其它八个引脚分别对应八个二极管…...
不同方式获取音频时长 - python 实现
DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…...
【python A* pygame 格式化 自定义起点、终点、障碍】
- pip install pygame test.py(chatgpt版本) 空格键:运行 A* 算法。CtrlC 键:清空路径。CtrlS 键:保存当前地图到 map.json 文件。CtrlL 键:从 map.json 文件加载地图。 import pygame import json from queue import PriorityQ…...
12_Redis发布订阅
1.Redis发布订阅介绍 1.1 基本概念 Redis的发布订阅(Pub/Sub)是一种消息通信模式,允许消息的发布者(Publisher)将消息发布到一个或多个频道(Channel),订阅者(Subscriber)通过订阅这些频道来接收消息。 发布者(Publisher):发送消息的一方,使用PUBLISH命令将消息…...
归并排序:数据排序的高效之道
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
【redis初阶】浅谈分布式系统
目录 一、常见概念 1.1 基本概念 2.2 评价指标(Metric) 二、架构演进 2.1 单机架构 2.2 应用数据分离架构 2.3 应用服务集群架构 2.4 读写分离/主从分离架构 2.5 引入缓存 ⸺ 冷热分离架构 2.6 数据库分库分表 2.7 业务拆分 ⸺ 引入微服务 redis学习&…...
CatLog的使用
一 CatLog的简介 1.1 作用 CAT(Central Application Tracking) 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。 1.2 组成部分 1.2.1 Transaction 1.Transaction 适合记录跨越系统边界的程序访问行为&a…...
头歌python实验:网络安全应用实践-恶意流量检测
第1关:re 库的使用 本关任务:编写一个能正则匹配出 ip 地址的小程序。 re 的主要功能函数 常用的功能函数包括: compile、search、match、split、findall(finditer)、sub(subn)。 re.search 函数 re.search 扫描整个字符串并返回第一个成功的匹配。 函数语法: re…...
大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(2)
大模型WebUI:Gradio全解11——Chatbots:融合大模型的聊天机器人(2) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.2 使用流行的LLM库和API11.2.1 Llama Index11.2.2 LangChain11.2.3 OpenAI1. 基本用法2. …...
如何用 Python 实现简单的 AI 模型?
💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...
单片机-直流电机实验
1、ULN2003芯片介绍 ULN2003, 该芯片是一个单片高电压、高电流的达林顿晶体管阵列集成电路。不仅可以用来 驱动直流电机,还可用来驱动五线四相步进电机。支持驱动大功率电器 因为 ULN2003 的输出是集电极开路,ULN2003 要输出高电平࿰…...
python【数据结构】
1. 列表 Python 中列表是可变的,这是它区别于字符串和元组的最重要的特点;即,列表可以修改,而字符串和元组不能。 以下是 Python 中列表的方法: 方法描述list.append(x)把一个元素添加到列表的结尾,相当…...
详解Sonar与Jenkins 的集成使用!
本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner,最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…...
《笔记》青蛙跳台阶——斐波那契数列
斐波那契数列 斐波那契数列(Fibonacci Sequence)是一个经典的数学数列,其特点是每一项都是前两项的和。数列的前两项通常定义为 0 和 1(或 1 和 1),后续每一项都是前两项的和。 斐波那契数列的定义 斐波那…...
SpringBoot3动态切换数据源
背景 随着公司业务战略的发展,相关的软件服务也逐步的向多元化转变,之前是单纯的拿项目,赚人工钱,现在开始向产品化\服务化转变。最近雷袭又接到一项新的挑战:了解SAAS模型,考虑怎么将公司的产品转换成多租…...
RS485接口EMC设计要点与工程实践
1. RS485接口电路设计概述RS485作为一种常见的工业通信接口,广泛应用于设备间的数据传输。在实际工程应用中,我发现很多工程师只关注通信功能实现,却忽视了关键的EMC设计,导致产品在测试或现场应用中出现各种问题。我曾参与过一款…...
知识竞赛软件售后服务哪家好?真实用户评价与选购指南
知识竞赛软件售后服务哪家好?真实用户评价揭秘在数字化教学与企业培训普及的今天,知识竞赛软件已成为学校、企业和各类机构开展活动的得力工具。然而,软件购买并非一锤子买卖,售后服务的质量直接关系到软件能否长期稳定运行、活动…...
数据治理与数据质量:从策略到实践
数据治理与数据质量:从策略到实践 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知数据治理和数据质量在企业数据管理中的重要性。随着数据量的爆炸式增长和数据类型的多样化,数据治理和数据质量已经成为企业数据管理的核心挑战。今…...
09_Neo4j知识体系之行业应用与最佳实践
09_Neo4j知识体系之行业应用与最佳实践 体系 行业应用层:金融反欺诈、智能推荐、社交网络分析、知识图谱构建、供应链优化关联能力:与图建模、路径分析、图算法、GraphRAG、实时决策和企业数据治理密切相关适用对象:解决方案架构师、行业数字…...
DFX测试与专项测试:非功能性测试的深度解析与实践指南
1. DFX测试:产品全生命周期的质量守护者 第一次接触DFX测试这个概念时,我也被这个缩写搞懵了。后来在实际项目中才发现,这其实就是把质量保障前置到设计阶段的绝佳实践。DFX中的"X"就像是个万能变量,可以代入产品生命周…...
2025届毕业生推荐的降重复率方案实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 学术写作以及论文发表进程里,查重之后的降重处置是关键一环,当下市面…...
全面革新你的Mac菜单栏:Ice管理工具的终极使用指南
全面革新你的Mac菜单栏:Ice管理工具的终极使用指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice macOS菜单栏常常被各种应用图标占据,导致视觉混乱且操作不便。Ice作为一款…...
ConvNeXt 改进 :ConvNeXt添加MKDConv(多核深度卷积,ICCV 2025),二次创新CNBlock结构 ,独家首发
本文教的是方法,也给出几种改进方法,二次创新结构,百变不离其宗,一文带你改进自己模型,科研路上少走弯路。 前言 本文解析的是发表于 ICCVW 2025 的轻量化医学影像分割网络 MK-UNet。在医学图像处理领域,病灶(如肿瘤、息肉)的尺度变化剧烈,传统的单核 CNN 难以平衡局…...
别再东拼西凑了!保姆级教程:用Anaconda在Windows上搞定PaddleOCR CPU版(附shapely安装避坑指南)
从零到一:Windows下Anaconda环境配置PaddleOCR全攻略 在文字识别技术领域,PaddleOCR以其出色的性能和易用性赢得了众多开发者的青睐。但对于初学者而言,从环境配置到成功运行往往充满挑战——版本冲突、依赖缺失、环境变量配置等问题层出不穷…...
YimMenu全面指南:从零开始掌握GTA V菜单工具
YimMenu全面指南:从零开始掌握GTA V菜单工具 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...
