拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python打卡第28天

Python打卡第28天

@浙大疏锦行

Python异常处理:try-except-else-finally

不知道大家有没有发现一个现象: 我们自己手写Python代码时,很少主动写try-except异常处理;但只要让AI生成代码,几乎所有IO、计算、数据读取的逻辑外面都会包上try-except。

原因很简单:大模型训练时,会优先保证代码能够成功运行。增加异常捕获,提升代码鲁棒性,遇到意外输入、文件缺失、运算错误时不会直接程序崩溃。 但很多同学只是复制粘贴AI代码,并不理解try整套机制的执行流程,遇到报错只会直接丢给AI修复,自身Debug能力很难提升。

今天这篇文章,完整梳理Python异常处理机制,拆解try-except-else-finally,带你读懂AI代码里的异常模块,学会主动捕获错误、读懂报错堆栈。

一、Python异常处理核心机制

Python程序运行时,如果遇到意外情况,就会抛出异常(Exception),并创建异常对象。 如果这段代码包裹在try块中,程序不会直接终止,而是去寻找匹配的except块处理错误;若无匹配捕获,异常向上抛出,程序崩溃,打印Traceback回溯信息。

整套语句由4个部分组成,其中try和except是必需,else、finally为可选:

  • try:存放可能抛出异常的代码,优先执行
  • except:捕获指定类型异常,异常发生时执行补救逻辑
  • else:仅try块无异常才执行,把成功后的业务逻辑和风险代码隔离
  • finally:无论是否报错、有没有捕获异常,一定会执行,用于资源清理

核心区分:else是成功分支;except是异常分支;finally是兜底清理分支。

二、基础语法:try-except

最基础的异常捕获结构,用来拦截指定类型错误,防止程序直接崩溃。

try: # 可能报错的代码 risk_code() except 指定异常类型: # 捕获到该类型异常时执行 handle_error() except: # 不推荐裸except,捕获所有异常,容易隐藏bug pass

编码规范:尽量捕获具体异常,不要直接写裸except。裸except会捕获KeyboardInterrupt这类中断信号,屏蔽程序致命问题,掩盖隐藏bug。

示例:除零异常捕获

numerator = 10 denominator = 0 try: print("尝试除法运算") result = numerator / denominator print(f"计算结果:{result}") except ZeroDivisionError: print("捕获异常:除数不能为0") result = None print("程序继续向下执行,不会直接崩溃")

执行逻辑:

  1. 进入try执行代码,触发除零异常
  2. try内出错之后的代码不再继续执行,直接跳出try
  3. 匹配ZeroDivisionError,执行except内代码
  4. except执行完毕,跳出整个try结构,继续执行后续代码

重点:如果抛出的异常类型,所有except都没有匹配上 → 不会进入任何except,异常向上抛出,程序崩溃;但是finally(如果存在)依旧会执行!

三、try-except-else:很多人容易误解的else

else子句:try块代码完全正常、没有抛出任何异常,才会执行else。 很多新手会混淆try-else和if-else,这里一定要分清:

  • if-else:两个分支只会执行其中一个
  • try-except-else:try执行成功 → try代码 + else代码都会执行;try报错 → 执行except,else完全跳过

else设计的核心价值

把可能报错的风险代码和成功后的后续逻辑分开。 如果把后续业务代码写在try里面,后续代码抛出的异常,会被当前的except意外捕获,造成逻辑错乱。放到else,else里代码抛出的异常不会被当前try的except捕获。

示例:安全除法函数

def safe_divide(a, b): print(f"\n计算 {a} / {b}") try: result = a / b except ZeroDivisionError: print("异常:除数不能为0") return None except TypeError: print("异常:输入必须是数字") return None else: # 只有除法运算成功,才执行这里 print("运算成功") print(f"原始结果:{result},两倍结果:{result*2}") return result safe_divide(10,2) # 正常,走try+else safe_divide(10,0) # 除零,走except,跳过else safe_divide("10",2) # 类型错误,走except,跳过else

四、finally:资源清理的兜底保障

finally最大特点:无论什么情况,一定会执行。

  • try正常执行 ✅ → 执行finally
  • try报错,匹配except ✅ → 执行finally
  • try报错,没有匹配except,程序即将崩溃 ✅ → 依然先执行finally
  • try/except内部写了return函数提前返回 ✅,return前依然执行finally

典型使用场景(ML开发、文件IO高频使用):

  1. 文件读写:关闭文件句柄,防止文件损坏、数据丢失
  2. 数据库:关闭数据库连接
  3. 深度学习训练:释放显存、记录日志、保存断点,就算OOM、手动中断,也能保存状态
  4. 临时修改全局参数,结束后恢复原始配置

补充:日常文件读写,优先用with上下文管理器,它底层封装了类似finally的自动资源释放,写法更简洁。

完整四合一模板:try-except-else-finally

def demo(): try: print("进入try,执行风险代码") res = 10 / 2 except ZeroDivisionError: print("捕获除零错误") res = None else: print("try无异常,进入else") res *= 10 finally: print("finally:无论如何都会执行,清理资源") return res demo()

五、Python高频异常类型汇总

看懂Traceback报错,第一步就是识别异常类型,这是独立Debug的基础:

  1. SyntaxError语法错误:代码语法不合法,解释器解析阶段就报错,还没运行代码,try捕获不到
  2. NameError名称错误:使用未定义的变量/函数名,大概率拼写错误
  3. TypeError类型错误:对不支持的类型执行操作,例如字符串 + 数字
  4. ValueError值错误:类型正确,但数值无效,如float("12.34.56")
  5. IndexError索引错误:列表、字符串索引越界,访问不存在下标
  6. KeyError键错误:字典读取不存在的key
  7. AttributeError属性错误:对象没有该属性/方法,例如字符串.length
  8. ZeroDivisionError除零错误,除数为0
  9. FileNotFoundError文件不存在,读取文件路径错误
  10. ModuleNotFoundError模块缺失,需要pip安装第三方库

程序报错时Traceback回溯信息包含4个关键信息: ① 异常类型 ② 报错文件与行号 ③ 出错代码行 ④ 错误描述。

建议:遇到报错,优先阅读Traceback,不要直接复制丢给AI。读懂报错,才是提升Debug能力的关键。

六、编码建议与避坑总结

  1. 捕获异常尽量写具体异常类型,不要直接裸except:,避免掩盖致命错误
  2. try块尽量精简,只包裹真正可能抛出异常的代码,不要把无关业务全部塞进try
  3. 成功后的后续逻辑放到else,隔离风险代码,避免异常误捕获
  4. 资源释放(关闭文件、连接)优先finally,或者with上下文管理器
  5. 不要滥用try,能用if前置判断的逻辑优先if;try用于不可提前预判的运行时意外

七、结语

try-except不是AI专属的花活,是工业级Python代码必备的容错机制。 AI写代码大量使用它,本质是提升代码鲁棒性,应对各种不可预知的输入与环境。 学会读懂这套异常处理机制,看懂Traceback,遇到报错尝试自己定位异常类型,而不是无脑交给AI,才能真正提升代码能力。


可选CSDN摘要一句话

本文详解Python try-except-else-finally全套异常处理语法,拆解执行逻辑,列举常见异常类型,讲解else和finally的使用场景,看懂AI代码里大量出现的异常捕获模块,学会独立排查报错。

如果你想,我可以再给你配套:

  1. 文末【思考题】(适合博客互动评论区)
  2. 一段精简的摘要+关键词
  3. 把文章压缩成适合短视频/公众号版本

要不要顺便写几个评论区思考题?比如:

Q1:try里面抛出异常,没有匹配except,finally还会执行吗? Q2:else里面抛出的异常,会被当前try的except捕获吗?

返回列表