
一、什么是Python异常1、定义异常是 Python 程序运行期间检测到的非正常情况或错误事件当程序无法按照正常逻辑继续执行时会主动抛出异常对象中断程序默认执行流程。2、核心特点1异常属于运行时错误不是语法错误语法错误在代码解析阶段就无法运行异常是语法合法、执行过程中触发。2异常发生后若不进行捕获处理程序会立即终止并打印错误堆栈信息。二、异常演示例如除数为0异常print(10/0)抛出ZeroDivisionError异常三、为什么要做异常处理防止程序直接崩溃终止程序运行时一旦出现异常若无异常处理会直接中断执行、退出程序后续所有代码都无法运行。提高程序健壮性与容错能力程序运行中会遇到不可预知的外部或数据问题用户输入非法数据、文件不存在或路径错误、列表索引越界、字典键不存在等异常处理可以对这些意外情况做兜底逻辑让程序从容应对错误而不是直接报错闪退。自定义友好错误提示系统默认的异常报错信息专业、晦涩普通用户看不懂。通过捕获异常自定义异常提示可以屏蔽底层英文报错输出通俗易懂的中文提示提升交互体验。保证关键代码必须执行通过finally结构无论是否发生异常都能确保文件关闭、断开数据库连接、释放资源等finally结构中的代码一定执行避免资源泄漏。规范业务逻辑主动抛出错可以用raise自定义抛出异常对不符合业务规则的数据进行校验拦截让程序逻辑更严谨规范。四、常见Python异常异常名称中文名称定义错误场景NameError变量或名称未定义错误使用了没有定义的变量如num没有定义就直接打印print(num)SyntaxError语法错误代码语法错误不符合Python原则如if ab没有写冒号IndexError索引超出范围错误索引或下标超过了指定范围如列表lst[1,2,3]打印print(lst[3])下标最大是2ZeroDivisionError除零错误除数为0如print(5/0)KeyError字典键不存在错误字典中没有这个键如字典info{name:张三}打印print(info[age])age不存在AttributeError属性或方法不存在错误对象没有这个属性如字符串调用列表的append方法ValueError值类型或格式错误传入的值不对类型对但是内容无效如int(abc)字符串不能转整型TypeError类型错误类型不匹配如print(12)数字与字符串不能相加ImportError模块导入错误导入模块失败路径或模块名错误如import pandas123模块名不存在IndentationError缩进错误缩进错误代码没对齐如python通常是四个缩进只有两个缩进时抛异常五、捕获异常语法try:# 尝试执行这段代码可能触发异常的代码块except[异常类型as变名]:# 捕获异常后,执行这里的逻辑异常发生时执行的代码块else:# 没有发生异常才执行这里无异常时执行的代码块finally:# 不管有没有异常最后都执行执行无论是否异常都执行的代码块1、捕获所有异常用Exception捕获所有的非语法错误例如try:numint(input(请输入一个数字))exceptException:print(f输入错误请输入纯数字)用户输入是字符串 aaa 时抛出异常2、捕获指定异常捕获单一异常例如捕获值错误try:numint(input(请输入一个数字))exceptValueError:print(传入值错误请输入纯数字)捕获多个异常捕获多个异常时同一逻辑处理用元组指定多种异常触发任意一种都执行相同处理。例如捕获值错误和除零错误try:numint(input(请输入一个数字))print(5/0)# 用元组同时捕获两种异常值错误、除零错误except(ValueError,ZeroDivisionError):print(发生错误可能输入不对或除零错误)用户输入数字实际触发 ZeroDivisionError用户输入字母实际触发 ValueError分类型捕获不同类型不同处理分类型捕获是指在代码中通过多个独立的except分支分别捕获不同类型的异常并为每种异常编写专属的处理逻辑能精准定位问题给用户更明确、友好的反馈。例如捕获值错误和变量未定义错误try:numint(input(请输入一个数字))print(num1)exceptValueError:print(输入错误请输入纯数字)exceptNameError:print(输入错误使用没有定义的变量)用户输入数字是触发 NameError用户输入数字是触发 NameError3、捕获异常描述信息在 Python 中用as e获取异常对象打印具体错误原因便于定位问题。例如try:print(10/0)exceptExceptionase:print(f错误原因{e})六、else用法在 Python 异常处理中else 是 try-except 结构的可选分支它的核心作用是当 try 代码块中没有发生任何异常时才会执行 else 里的代码。例如try:numint(input(请输入一个数字))exceptExceptionase:print(f错误类型{e})else:print(f输入正确你输入的数字是{num})用户输入正确无异常执行 else七、finally用法在 Python 异常处理中finally 是 try-except 结构的收尾分支它的核心特性是无论 try 代码块中是否发生异常finally 里的代码都会被执行。常用于释放资源如打开文件后不管操作是否成功最后都要关闭文件。例如print(打开文件...)try:print(文件操作)exceptExceptionase:print(e)finally:print(关闭文件...)八、抛出自定义异常1、定义Python 内置了很多异常如 ValueError、IndexError但当这些通用异常无法精准描述你的业务错误时比如 “年龄不能为负数”“密码长度不足”就需要自定义异常类。在代码中通过raise关键字主动触发我们定义的异常让程序按预期流程跳转到异常处理逻辑而不是直接崩溃。2、实现自定义异常实现步骤步骤1创建异常对象语法异常类型(异常具体描述信息)步骤2用raise语句抛出异常对象语法raise 异常对象3、案例例如模拟银行取款。# 需求模拟银行取款场景# 取款金额超出余额抛出余额不足异常账户账号冻结抛出冻结异常# 余额 1000balance1000# 账户状态是否冻结 False 没有冻结True 冻结is_frozenFalse#实现一个功能的代码 函数defbank(amount):globalbalance# 抛出异常# 先判断账户是否冻结ifis_frozen:# 账户冻结 抛出异常raiseException(账户冻结)# 再判断余额是否充足余额 取款金额余额不足 抛出异常ifbalanceamount:raiseException(f余额不足当前余额{balance})# 取款余额 余额-取款金额balance-amountprint(f当前余额{balance})# 捕获异常try:bank(1500)exceptExceptionase:print(e)当取款金额1500大于余额是抛出异常并且捕获到异常注意raise是主动抛出异常如我发现了错误我把错误扔出去try/except捕获异常如我接住你扔出来的错误不让程序崩溃。