day25 python异常处置惩罚

[复制链接]
发表于 2025-9-3 09:23:24 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次

Python 的异常处置惩罚机制
核心概念
常见的异常处置惩罚结构
try-except
try-except-else
常见异常类型
SyntaxError(语法错误)
NameError(名称错误)
TypeError(类型错误)
ValueError(值错误)
IndexError(索引错误)
KeyError(键错误)
AttributeError(属性错误)
ZeroDivisionError(除零错误)
FileNotFoundError(文件未找到错误)
ModuleNotFoundError(导入错误)
使用 try-except 捕获异常
捕获 ZeroDivisionError
捕获 TypeError
try-except-else-finally 的综合应用
try-except-else
finally 子句
总结

在借助 AI 辅助编写代码的过程中,我们经常会遇到 try-except 异常处置惩罚模块。这是由于大部分大模子在后练习阶段都经过了强化学习练习,为了确保代码的正确运行,try-except 异常处置惩罚模块能够明显提高模子运行成功的概率。然而,在日常手动编写代码时,我们大概并不会频繁使用这种写法。因此,本日我们将深入探讨 Python 的异常处置惩罚机制,帮助大家更好地顺应这种编程范式。
Python 的异常处置惩罚机制

Python 的异常处置惩罚机制为步伐提供了强大的容错本领(fault tolerance)。当步伐在运行时遇到不测环境(即异常)时,它不会直接瓦解,而是可以被设计成优雅地处置惩罚这些错误,并大概继承实行后续逻辑(假如设计允许)或以可控的方式竣事。
当异常发生时,Python 会创建一个异常对象(exception object),通常是 Exception 类的子类实例。假如这段大概出错的代码位于 try 语句块中,步伐流程会探求并跳转到匹配的 except 语句块(假如存在)来处置惩罚这个异常。
核心概念



  • try:包罗大概会引发异常的代码块。步伐会起首实验实行这里的代码。
  • except:假如 try 块中的代码确实引发了特定类型的异常(或者任何异常,假如未指定类型),则实行此代码块。
  • else(可选):假如 try 块中的代码没有发生任何异常,则实行此代码块。
  • finally(可选):无论 try 块中是否发生异常,总会实行此代码块(常用于资源清理)。
常见的异常处置惩罚结构

try-except

这是最基本的错误处置惩罚结构。
  1. try:
  2.     # 可能会引发异常的代码
  3. except ExceptionType:  # 最好指定具体的异常类型,例如 ZeroDivisionError, FileNotFoundError
  4.     # 当 try 块中发生 ExceptionType 类型的异常时执行的代码
  5. except:  # 不推荐:捕获所有类型的异常,可能会隐藏bug
  6.     # 当 try 块中发生任何其他未被前面 except 捕获的异常时执行的代码
复制代码
逻辑说明:步伐起首实验实行 try 块中的代码。假如 try 块中的代码没有发生异常,则 except 块会被跳过,步伐继承实行 try-except 结构之后的代码。假如 try 块中的代码发生了异常,Python 会查找与该异常类型匹配的 except 块。假如找到匹配的,则实行该 except 块中的代码,然后继承实行整个 try-except 结构之后的代码(除非 except 块中又引发了新异常或实行了 return/break/continue 等)。假如未找到匹配的 except 块,异常会向上传播。
类比:你可以把它看作是:“实验做这件事,假如出错了(而且是特定类型的错误),就实行补救步伐。”
try-except-else

在 try-except 的底子上增加了 else 子句。
  1. try:
  2.     # 可能会引发异常的代码
  3. except ExceptionType:
  4.     # 当 try 块中发生 ExceptionType 类型的异常时执行的代码
  5. else:
  6.     # 当 try 块中【没有】发生任何异常时执行的代码
复制代码
逻辑说明:起首,实行 try 块中的代码。假如 try 块中发生异常,则会查找并实行匹配的 except 块,else 块不会被实行。假如 try 块中没有发生任何异常,则会跳过全部 except 块,然后实行 else 块中的代码。
与 if-else-elif 的区别(重要!)


  • 在 if-elif-else 结构中,只有一个代码块会被实行(if 条件满意则实行 if 块;否则检查 elif,满意则实行 elif 块;否则实行 else 块)。
  • 而在 try-except-else 结构中:

    • 假如 try 成功:try 块的代码会实行,然后 else 块的代码也会实行。
    • 假如 try 失败:try 块中出错前的代码会实行,然后匹配的 except 块的代码会实行(else 块不会实行)。

更准确的理解:else 子句中的代码是你渴望在 try 块中的代码成功完成且没有引发任何异常之后才实行的代码。这通常用于分离“主要实验的操作”和“操作成功后的后续步骤”,使得 try 块更聚焦于大概出错的部分。
一个简单的例子论述 else 的作用
  1. try:
  2.     # 假设 result_operation() 是一个可能出错的操作
  3.     value = result_operation()
  4. except SomeError:
  5.     print("操作失败,使用默认值。")
  6.     value = default_value
  7. else:
  8.     # 只有当 result_operation() 成功时,才执行这里的代码
  9.     print(f"操作成功,结果是: {value}。现在进行后续处理...")
  10.     process_value_further(value)
复制代码
假如把 process_value_further(value) 放在 try 块内,那么假如 process_value_further 本身也大概抛出 SomeError(或其他 try 块想要捕获的错误),它就会被不测捕获。else 块确保了只有在 try 块中的代码完全无误地实行完毕后,才会实行 else 块的内容。
常见异常类型

在日常开发中,我们经常会遇到以下几种异常:
SyntaxError(语法错误)

原因:代码不符合 Python 的语法规则,解释器在实验解析代码时就会失败。这种错误在步伐运行之前就会被检测到。
  1. # 示例 a: 缺少冒号
  2. # def my_function()
  3. #     print("Hello")
  4. # 示例 b: 非法表达式
  5. # x = 5 +
  6. # print(x)
复制代码
NameError(名称错误)

原因:实验使用一个未被定义的变量、函数或对象的名称。
  1. # 示例 a: 变量未定义
  2. # print(some_undefined_variable)
  3. # 示例 b: 打错变量名
  4. # print(my_lisst)  # 变量名拼写错误
复制代码
TypeError(类型错误)

原因:对一个不支持该操作的数据类型实行了某个操作或函数。
  1. # print("Age: " + 25)  # 字符串和整数
  2. # my_number = 10
  3. # my_number()  # 尝试像函数一样调用一个整数
复制代码
ValueError(值错误)

原因:函数接收到的参数类型正确,但其值不符合或无效。
  1. # my_string = "12.34.56"
  2. # number = float(my_string)  # '12.34.56' 不是一个有效的浮点数表示
复制代码
IndexError(索引错误)

原因:实验访问序列(如列表、元组、字符串)中一个不存在的索引。
  1. # data = ("apple", "banana")
  2. # print(data[2])
复制代码
KeyError(键错误)

原因:实验访问字典中一个不存在的键。
  1. # student_grades = {"math": 90, "science": 85}
  2. # print(student_grades["history"])
复制代码
AttributeError(属性错误)

原因:实验访问一个对象没有的属性或方法。
  1. # 示例 a
  2. # a_string = "hello"
  3. # print(a_string.length)  # 字符串长度用 len(a_string),不是 .length 属性
  4. # 示例 b
  5. # import numpy as np
  6. # arr = np.array([1, 2, 3])
  7. # print(arr.non_existent_attribute)
复制代码
ZeroDivisionError(除零错误)

原因:实验将一个数字除以零。
  1. # result = 10 / 0
复制代码
FileNotFoundError(文件未找到错误)

原因:实验打开一个不存在的文件(通常是在读模式下),或者路径不正确。
  1. # import pandas as pd
  2. # data = pd.read_csv("hh.csv")
复制代码
ModuleNotFoundError(导入错误)

原因:实验导入一个不存在的模块,或者模块存在但其中的特定名称找不到。可以通过安装库解决,假如是自定义模块,则须要设置好对应的路径。
  1. # import hhh
复制代码
使用 try-except 捕获异常

今世码出现错误时,步伐会立刻停止实行,并打印出一个“traceback”(回溯信息),这个信息非常重要,它会告诉你:


  • 错误类型(比方 NameError, TypeError)
  • 错误发生的文件名和行号
  • 导致错误的那行代码
  • 错误的简要形貌
接下来,我们用固定的语句来捕获这类错误。
捕获 ZeroDivisionError

  1. print("--- 使用 try-except 捕获 ZeroDivisionError ---")
  2. numerator = 10
  3. denominator = 0
  4. try:
  5.     print("尝试进行除法运算...")
  6.     result = numerator / denominator  # 潜在的风险代码
  7.     print(f"计算结果是: {result}")  # 如果上面出错,这行不会执行
  8. except ZeroDivisionError:
  9.     print("发生了一个除以零的错误!")
  10.     result = "未定义 (除以零)"  # 可以给一个默认值或提示
  11. print(f"程序继续执行... 最终结果的记录为: {result}")
复制代码
捕获 TypeError

  1. print("--- 使用 try-except 捕获 TypeError ---")
  2. x = "Total items: "
  3. y = 5  # 假设这是一个从某处获取的数字
  4. try:
  5.     print("尝试连接字符串和数字...")
  6.     message = x + y  # 潜在的 TypeError
  7.     print(f"最终消息: {message}")
  8. except TypeError:
  9.     print("类型错误!不能直接将字符串和数字相加。")
  10.     print("尝试将数字转换为字符串进行连接...")
  11.     message = x + str(y)  # 修正操作
  12.     print(f"修正后的消息: {message}")
  13. print(f"程序继续... 生成的消息是: {message}")
复制代码
try-except-else-finally 的综合应用

try-except-else

else 子句中的代码只有在 try 块中的代码成功实行且没有引发任何异常之后才会实行。这有助于分离“主要实验的操作”和“操作成功后的后续步骤”,使得代码更加清晰。
  1. print("--- try-except-else 示例 ---")
  2. def safe_divide(a, b):
  3.     print(f"\n尝试计算 {a} / {b}")
  4.     try:
  5.         result = a / b
  6.     except ZeroDivisionError:
  7.         print("错误:除数不能为零!")
  8.         return None  # 或者其他表示失败的值
  9.     except TypeError:
  10.         print("错误:输入必须是数字!")
  11.         return None
  12.     else:
  13.         # 只有当 try 块中的 a / b 成功执行时,这里才会执行
  14.         print("除法运算成功!")
  15.         print(f"结果是: {result}")
  16.         # 可以在这里进行基于成功结果的进一步操作
  17.         print(f"结果的两倍是: {result * 2}")
  18.         return result
  19. # 测试用例
  20. safe_divide(10, 2)  # 成功
  21. safe_divide(10, 0)  # ZeroDivisionError
  22. safe_divide("10", 2)  # TypeError
  23. safe_divide(20, "abc")  # TypeError
复制代码
finally 子句

finally 子句中的代码无论 try 块中是否发生异常,也无论 except 块是否被实行,乃至无论 try 或 except 块中是否有 return 语句,它总会被实行。这个特性在资源管理中非常重要,比方:


  • 无论练习成功、失败还是中途被打断,都确保日志日志文件被正确关闭,制止数据丢失或文件损坏。
  • 确保计算资源在使用完毕后被释放,供其他进程或任务使用。
  • 关闭数据库连接。
  • 恢复全局状态或设置,假如步伐在运行过程中修改了全局变量或设置文件,在异常处置惩罚竣过后,须要恢复到之前的状态或设置。
  • 在机器学习和深度学习项目中,模子练习大概非常耗时,假如中途由于各种原因(OOM、手动中断、硬件故障)停止,我们渴望记载下中断的状态,方便后续恢复。
在 ML/DL 项目中,由于流程长、资源消耗大、外部依靠多,finally 提供的这种“保证实行”的机制对于构建稳定、可靠的系统至关重要。
总结

渴望能够更好地理解 Python 的异常处置惩罚机制,并学会怎样使用 try-except、try-except-else 和 try-except-else-finally 来编写更加健壮的代码。在日常开发中,我们不应该总是依靠 AI 来解决错误,而是要学会通过阅读错误信息来定位息争决问题,这样才能真正提升自己的编程本领。

@浙大疏锦行

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表