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

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 语句,它总会被执行。

@浙大疏锦行

相关文章:

  • Python爬虫之品牌口碑数据抓取
  • 设计模式(9)——创建型模式之工厂方法
  • golang -- 如何让main goroutine等一等
  • 微信小程序之按钮短时间内被多次点击问题
  • 【taro3 + vue3 + webpack4】在微信小程序中的请求封装及使用
  • DeepSeek 赋能 VR/AR:开启智能交互新纪元
  • 基于开源AI大模型与S2B2C生态的个人品牌优势挖掘与标签重构研究
  • vue使用路由技术实现登录成功后跳转到首页
  • Vue3在使用渲染函数h时候使用v-loading
  • 「数学::博弈论」Nim游戏(尼姆游戏)/ Luogu P2197(C++)
  • RabbitMQ是什么?应用场景有哪些?
  • 基于EMD-PCA-LSTM的光伏功率预测模型研究
  • OpenEvidence AI临床决策支持工具平台研究报告
  • 【Python】抽象基类ABC
  • 【springcloud学习(dalston.sr1)】服务消费者通过restTemplate来访问服务提供者(含源代码)(五)
  • 仿生眼机器人(人脸跟踪版)系列之一
  • 基于EFISH-SCB-RK3576/SAIL-RK3576的智能零售柜技术方案
  • Web 架构之会话保持深度解析
  • 使用GRPO训练调度事件的语言模型!
  • Vue3学习(组合式API——Watch侦听器详解)
  • 美国与卡塔尔签署超2435亿美元经济及军事合作协议
  • KPL“王朝”诞生背后:AG和联赛一起迈向成熟
  • 佩斯科夫:若普京认为必要,将公布土耳其谈判俄方代表人选
  • Manus向全球用户开放注册
  • 青海规范旅游包车行为:不得引导外省籍旅游包车违规驻地运营
  • 宁德时代港股募资预计最高至50亿美元:90%将投向匈牙利项目