type
status
date
slug
summary
tags
category
icon
password
comment
在编写 Python 代码时,我们经常会遇到各种 错误(Error)和 异常(Exception),比如 除零错误(ZeroDivisionError)、索引越界(IndexError),甚至是 文件未找到(FileNotFoundError)。如果不加以处理,这些错误可能会导致程序崩溃。
💡 如何让代码更加健壮?
- 提前预防错误(如:检查输入、验证文件是否存在)
- 使用异常处理机制,在代码运行时 优雅地应对错误
- 记录错误信息,方便后续调试和优化
在本节中,我们将学习 Python 的 异常处理机制,掌握如何捕获、抛出和自定义异常,使代码更加健壮!
1. 什么是异常(Exception)?
在 Python 运行时,可能会遇到各种 错误(Error),其中 异常(Exception) 是一种特殊类型的错误,它会 中断程序的执行,如果不加以处理,程序会直接崩溃。
常见的 Python 异常
Python 提供了多种内置异常,我们可以根据不同的情况采取不同的处理方式。
异常类型 | 触发原因 | 示例 |
ZeroDivisionError | 试图除以 0 | 10 / 0 |
IndexError | 访问超出索引范围的元素 | lst = [1, 2, 3]; lst[5] |
KeyError | 访问字典中不存在的键 | d = {'a': 1}; d['b'] |
TypeError | 对不兼容的数据类型执行操作 | "3" + 5 |
ValueError | 传递无效的参数 | int("abc") |
FileNotFoundError | 试图访问不存在的文件 | open("non_existent.txt") |
AttributeError | 访问对象不存在的属性 | None.some_method() |
🔍 示例:异常的触发
✅ 小结
- 异常是程序运行时的错误,如果不加以处理,程序会终止运行。
- 不同的异常类型对应不同的错误场景,理解这些异常有助于更好地调试代码。
2. try-except 语句:捕获异常
在 Python 中,
try-except 语句用于 捕获和处理异常,确保程序在发生错误时不会崩溃,而是优雅地处理问题。🔹 try-except 基本用法
当代码块中的某个操作可能引发异常时,可以使用
try 语句包裹它,并在 except 语句中捕获并处理错误。🔍 代码解析
try代码块:包含可能出错的代码,如int(input())可能导致ValueError,10 / num可能导致ZeroDivisionError。
except代码块:except ZeroDivisionError:捕获 除零错误,并提供友好的错误信息。except ValueError:捕获 无效输入错误,防止用户输入非整数时程序崩溃。
print("程序继续运行..."):即使异常发生,程序仍能继续执行,不会直接终止。
🔹 捕获多个异常
如果希望在
except 代码块中同时处理多种异常,可以使用 元组。在这里,
except (ZeroDivisionError, ValueError): 可以同时捕获 除零错误 和 类型错误,减少重复代码。🔹 捕获所有异常
如果我们不确定会发生什么异常,可以使用
Exception 作为通用异常捕获:💡
Exception 是所有内置异常的基类,它能捕获大多数异常,并通过 as e 获取具体的错误信息。但通常不推荐直接捕获所有异常,最好针对具体错误进行处理,以便更好地调试代码。✅ 为什么要使用
try-except?- 防止程序崩溃:即使用户输入错误,程序仍然能继续执行。
- 提供友好提示:相比直接报错并终止,提示用户正确的输入方式更加友好。
- 提升代码健壮性:适用于处理用户输入、文件操作、网络请求等可能出现异常的场景。
3. try-except-else-finally 结构:更完善的异常处理机制
🔹 结构解析
语句 | 作用 |
try | 包含可能引发异常的代码 |
except | 处理 try 代码块中的异常 |
else | 如果 try 代码块没有异常,则执行此部分 |
finally | 无论是否发生异常,都会执行(通常用于清理资源) |
🔹 示例:完整的 try-except-else-finally 结构
🔹 else 语句的作用
else 只有在 try 代码块成功执行且未发生异常时 才会运行。例如,在计算过程中可能需要 执行额外的成功处理逻辑,如记录日志或更新 UI:✅
else 适用于确保 try 代码块成功后执行额外操作,如文件读取、数据存储等。🔹 finally 语句的作用
finally 无论是否发生异常都会执行,通常用于清理资源(如关闭文件、释放数据库连接)。✅
finally 适用于资源释放(如文件、数据库连接、网络请求),即使 try 发生异常,也能保证资源被正确清理。何时使用 else 和 finally?
语句 | 适用场景 |
else | 当 try 成功时,执行额外的代码,例如 日志记录、结果处理 |
finally | 始终执行,适用于 资源释放,如关闭文件、断开数据库连接 |
4. raise:主动抛出异常
在某些情况下,我们需要手动抛出异常,以确保数据的正确性,或者提醒调用者输入不合法。例如,在函数参数检查、业务逻辑约束等场景中,
raise 可以防止程序在错误的状态下继续运行。🔹 raise 的基本用法
可以使用
raise 关键字主动触发异常,通常搭配 ValueError、TypeError 等内置异常类型。🔹 自定义异常
如果内置异常类型无法精准描述错误,可以自定义异常类,继承
Exception 或其子类。🔹 raise 和 try-except 结合使用
可以在
try-except 代码块中使用 raise 重新抛出异常,以便在更高层级处理。raise 的应用场景场景 | 示例 |
参数检查 | 确保输入值符合业务逻辑,如 age >= 0 |
自定义异常 | 适用于更精准的错误描述,例如 InvalidAgeError |
错误传播 | 在 try-except 代码块中,捕获后重新抛出异常 |
5. 总结
在 Python 中,异常处理是提高代码健壮性的关键,它能有效防止程序崩溃,并提供友好的错误提示。本节内容涵盖了异常的基本概念、捕获异常的
try-except 结构、raise 语句的使用等,使你能够更从容地应对各种错误情况。核心知识点回顾
概念 | 作用 | 示例 |
异常(Exception) | 运行时错误,可能导致程序崩溃 | ZeroDivisionError、TypeError、ValueError |
try-except | 捕获并处理异常,避免程序终止 | try: ... except ValueError: ... |
else 语句 | try 代码块成功执行时运行 | else: print("无异常") |
finally 语句 | 无论是否发生异常,都会执行 | finally: print("清理资源") |
raise 语句 | 主动抛出异常,确保数据有效性 | raise ValueError("输入不合法") |
为什么异常处理很重要?
✅ 提升代码稳定性 —— 避免因输入错误、运算错误导致程序崩溃。
✅ 提供更好的用户体验 —— 友好的错误提示比直接报错更易理解。
✅ 易于调试和维护 —— 通过捕获异常,可以快速定位并修复问题。
⏭️ 下一节预告:📂 Python 文件操作:高效读写与错误处理
在下一篇文章中,我们将探索 Python 文件操作,学习如何高效、安全地处理文件数据,包括:
- 如何检测文件是否存在,避免不必要的错误
- 如何正确读取和写入文件,提升数据管理能力
- 如何优雅地处理文件操作中的异常,确保代码稳健运行
📂 文件处理是 Python 开发中的重要技能,让你的代码更加实用与高效!敬请期待! 🚀