⚠️ Python 异常处理:让代码更稳健

Evan Zhou

Tech Chronicles|Jan 31, 2025|Last edited: Oct 17, 2025|
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 语句中捕获并处理错误。
🔍 代码解析
  1. try 代码块:包含可能出错的代码,如 int(input()) 可能导致 ValueError10 / num 可能导致 ZeroDivisionError
  1. except 代码块
      • except ZeroDivisionError: 捕获 除零错误,并提供友好的错误信息。
      • except ValueError: 捕获 无效输入错误,防止用户输入非整数时程序崩溃。
  1. 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 发生异常,也能保证资源被正确清理。

何时使用 elsefinally

语句
适用场景
else
try 成功时,执行额外的代码,例如 日志记录、结果处理
finally
始终执行,适用于 资源释放,如关闭文件、断开数据库连接

4. raise:主动抛出异常

在某些情况下,我们需要手动抛出异常,以确保数据的正确性,或者提醒调用者输入不合法。例如,在函数参数检查、业务逻辑约束等场景中,raise 可以防止程序在错误的状态下继续运行。

🔹 raise 的基本用法

可以使用 raise 关键字主动触发异常,通常搭配 ValueErrorTypeError 等内置异常类型。

🔹 自定义异常

如果内置异常类型无法精准描述错误,可以自定义异常类,继承 Exception 或其子类。

🔹 raisetry-except 结合使用

可以在 try-except 代码块中使用 raise 重新抛出异常,以便在更高层级处理。

raise 的应用场景
场景
示例
参数检查
确保输入值符合业务逻辑,如 age >= 0
自定义异常
适用于更精准的错误描述,例如 InvalidAgeError
错误传播
try-except 代码块中,捕获后重新抛出异常

5. 总结

在 Python 中,异常处理是提高代码健壮性的关键,它能有效防止程序崩溃,并提供友好的错误提示。本节内容涵盖了异常的基本概念、捕获异常的 try-except 结构、raise 语句的使用等,使你能够更从容地应对各种错误情况。

核心知识点回顾

概念
作用
示例
异常(Exception)
运行时错误,可能导致程序崩溃
ZeroDivisionErrorTypeErrorValueError
try-except
捕获并处理异常,避免程序终止
try: ... except ValueError: ...
else 语句
try 代码块成功执行时运行
else: print("无异常")
finally 语句
无论是否发生异常,都会执行
finally: print("清理资源")
raise 语句
主动抛出异常,确保数据有效性
raise ValueError("输入不合法")

为什么异常处理很重要?

提升代码稳定性 —— 避免因输入错误、运算错误导致程序崩溃。
提供更好的用户体验 —— 友好的错误提示比直接报错更易理解。
易于调试和维护 —— 通过捕获异常,可以快速定位并修复问题。

⏭️ 下一节预告:📂 Python 文件操作:高效读写与错误处理

在下一篇文章中,我们将探索 Python 文件操作,学习如何高效、安全地处理文件数据,包括:
  • 如何检测文件是否存在,避免不必要的错误
  • 如何正确读取和写入文件,提升数据管理能力
  • 如何优雅地处理文件操作中的异常,确保代码稳健运行
📂 文件处理是 Python 开发中的重要技能,让你的代码更加实用与高效!敬请期待! 🚀
 
Loading...