当前位置: 首页 > ds >正文

day25-异常处理

知识点回顾:
  1. 异常处理机制
  2. debug过程中的各类报错
  3. try-except机制
  4. try-except-else-finally机制

在即将进入深度学习专题学习前,我们最后差缺补漏,把一些常见且重要的知识点给他们补上,加深对代码和流程的理解。

作业:理解今日的内容即可,可以检查自己过去借助ai写的代码是否带有try-except机制,以后可以尝试采用这类写法增加代码健壮性。

(一)异常处理机制

Python的异常处理机制为程序提供了强大的容错能力 (fault tolerance)。当程序在运行时遇到意外情况(即异常),它不会直接崩溃,而是可以被设计成优雅地处理这些错误,并可能继续执行后续逻辑(如果设计允许)或以可控的方式结束。当异常发生时,Python会创建一个异常对象 (exception object)(通常是 Exception 类的子类实例)。如果这段可能出错的代码位于 try 语句块中,程序流程会寻找并跳转到匹配的 except 语句块(如果存在)来处理这个异常。

核心概念:

- try: 包含可能会引发异常的代码块。程序会首先尝试执行这里的代码。

- except: 如果try块中的代码确实引发了特定类型的异常(或者任何异常,如果未指定类型),则执行此代码块。

- else: (可选)如果try块中的代码没有发生任何异常,则执行此代码块。

- finally: (可选)无论try块中是否发生异常,总会执行此代码块(常用于资源清理)。

常见的语句结构: 

  1. try-except

  2. try-except-else

注意点:

#try-except-else结构:如果try异常则从异常处转接except后的代码,else不执行;若try无异常则进行else,跳过except。更准确的理解: else 子句中的代码是你希望在 try 块中的代码成功完成且没有引发任何异常之后才执行的代码。这通常用于分离“主要尝试的操作”和“操作成功后的后续步骤”,使得 try 块更聚焦于可能出错的部分。else 块确保了只有在 try 块中的代码完全无误地执行完毕后,才会执行 else 块的内容。

#与 if-else-elif 的区别:if-elif-else 结构中,只有一个代码块会被执行(if 条件满足则执行 if 块;否则检查 elif,满足则执行 elif 块;否则执行 else 块)。

#如果把“成功后的后续步骤”也放在 try 块里,而这些步骤本身也可能引发 try 块想要捕获的同类型异常,那么就会导致逻辑混淆。else 块中的代码不会被同一个 try 块的 except 子句捕获。

  • debug 

 

(二)try-except

print("--- 使用 try-except 捕获 TypeError ---")
x = "Total items: "
y = 5 # 假设这是一个从某处获取的数字try:print("尝试连接字符串和数字...")message = x + y # 潜在的 TypeErrorprint(f"最终消息: {message}")
except TypeError:print("类型错误!不能直接将字符串和数字相加。")print("尝试将数字转换为字符串进行连接...")message = x + str(y) # 修正操作print(f"修正后的消息: {message}")print(f"程序继续... 生成的消息是: {message}")

输出结果:

--- 使用 try-except 捕获 TypeError ---
尝试连接字符串和数字...
类型错误!不能直接将字符串和数字相加。
尝试将数字转换为字符串进行连接...
修正后的消息: Total items: 5
程序继续... 生成的消息是: Total items: 5

 (三)try - except- else -fiinally

print("--- try-except-else 示例 ---")def safe_divide(a, b):print(f"\n尝试计算 {a} / {b}")try:result = a / bexcept ZeroDivisionError:print("错误:除数不能为零!")return None # 或者其他表示失败的值except TypeError:print("错误:输入必须是数字!")return Noneelse:# 只有当 try 块中的 a / b 成功执行时,这里才会执行print("除法运算成功!")print(f"结果是: {result}")# 可以在这里进行基于成功结果的进一步操作print(f"结果的两倍是: {result * 2}")return result# 测试用例
safe_divide(10, 2)  # 成功
safe_divide(10, 0)  # ZeroDivisionError
safe_divide("10", 2) # TypeError (如果我们不先做类型转换的话)
safe_divide(20, "abc") # TypeError

输出结果:

--- try-except-else 示例 ---尝试计算 10 / 2
除法运算成功!
结果是: 5.0
结果的两倍是: 10.0尝试计算 10 / 0
错误:除数不能为零!尝试计算 10 / 2
错误:输入必须是数字!尝试计算 20 / abc
错误:输入必须是数字!

#finally 子句中的代码无论 try 块中是否发生异常,也无论 except 块是否被执行,甚至无论 try 或 except 块中是否有 return 语句,它总会被执行。

@浙大疏锦行

http://www.xdnf.cn/news/6278.html

相关文章:

  • [Java实战]Spring Security 添加验证码(二十三)
  • android实现USB通讯
  • 基于 Kubernetes 部署容器平台kubesphere
  • CCF第七届AIOps国际挑战赛季军分享(RAG)
  • YOLO v2:目标检测领域的全面性进化
  • 记录 QT 在liunx 下 QFileDialog 类调用问题 ()Linux下QFileDialog没反应)
  • AI日报 · 2025年5月14日|Android 生态大型更新与多端 Gemini 集成
  • UPS是什么?UPS 不间断电源有哪些适配的升压芯片?
  • zabbix7.2最新版本 nginx自定义监控(三) 设置触发器
  • MySQL之基础索引
  • postman 用法 LTS
  • 互联网大厂Java求职面试:AI内容生成平台下的高并发架构设计与性能优化
  • CycleISP: Real Image Restoration via Improved Data Synthesis通过改进数据合成实现真实图像恢复
  • Linux grep -r 查找依赖包是否存在依赖类 Class
  • 【Pycharm】pycharm修改注释文字的颜色
  • HDD 安全擦除:何时以及如何在 Windows PC 上安全擦除硬盘
  • 【SSL证书系列】客户端如何检查中间CA签名是否由根CA签发
  • 应用示例1:交通灯
  • 怎么快速换电脑浏览器的ip:方法与注意事项
  • Java零基础学习Day13——面向对象进阶
  • ClickHouse详解
  • Android学习总结之Glide自定义三级缓存(实战篇)
  • Linux相关概念和易错知识点(39)(URL、HTTP)
  • PlantSimulation 隐藏 Frame节点(Structure)的操作方法
  • 怎么实现Redis的高可用?
  • k8s 中使用 Service 访问时NetworkPolicy不生效问题排查
  • 快消零售AI转型:R²AIN SUITE如何破解效率困局
  • 电脑内存智能监控清理,优化性能的实用软件
  • linux - 权限的概念
  • BMS工具箱用来执行贝叶斯模型平均(BMA)计算模块