Python基础:你的编程第一步
错误处理
Lesson 15 of 16 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
错误在任何程序中都是不可避免的,Python 提供了多种方式来处理它们。
错误处理 对于确保程序在发生意外情况时仍能安全高效地继续运行至关重要。
在本课中,我们将探索不同类型的错误、如何处理它们、如何主动抛出错误,以及如何保证重要的清理任务总能执行。
Python 中的错误类型
在学习如何处理错误之前,我们需要了解两大类错误:
-
语法错误:当 Python 代码语法不正确时发生。这类错误在程序运行之前由解释器捕获。
例如:在if语句后忘记加冒号。 -
异常:当程序运行时发生的异常状况,例如除以零、访问列表中无效的索引等。
使用 try 和 except 处理异常
处理异常最常用的方法是使用 try/except 语句块:
- try 代码块包含可能引发异常的代码。
- except 代码块包含当异常发生时执行的代码。
示例:
try:
file = open("file.txt", "r")
content = file.read()
print(content)
except IOError:
print("无法打开文件。")
这里:
- 如果 "file.txt" 不存在或无法打开,Python 会引发
IOError。 except代码块捕获该异常,打印友好的提示信息,避免程序崩溃。
提示:保持 try 代码块尽可能小,只包含可能失败的代码,避免包含无关逻辑。
处理多种异常类型
你可以通过多个 except 代码块分别处理不同类型的异常:
try:
# 可能引发异常的代码
except TypeError:
# 处理类型错误
except ValueError:
# 处理值错误
except:
# 处理其他所有异常
最后的裸 except 捕获所有未处理的异常,但应谨慎使用,因为它可能隐藏未预期的错误。
主动抛出异常
有时程序需要主动表示某些错误情况——即使 Python 本身不会把它视为错误。
你可以用 raise 语句主动抛出异常。
示例:
def divide(a, b):
if b == 0:
raise ValueError("第二个参数不能为零")
return a / b
print(divide(10, 2)) # 5.0
print(divide(10, 0)) # ValueError: 第二个参数不能为零
这样可以定义清晰的错误消息,并在遇到无效数据时阻止程序继续执行。
finally 代码块
finally 代码块中的代码总会执行——无论是否发生异常。
通常用于释放资源,比如关闭文件或断开数据库连接。
示例:
try:
file = open("file.txt", "r")
content = file.read()
print(content)
finally:
file.close()
即使读取文件时发生错误,finally 代码块也保证文件被关闭。
重要提示:总是在 finally 代码块中关闭文件和释放资源(或者使用 "with" 语句)以避免资源泄漏。
补充说明:以下内容可作为 错误处理 课程的附加部分,用于解释为何“捕获所有异常”是不良实践,以及何时应选择针对异常的精确处理。
避免无理由捕获所有异常
初学者常犯的错误是用单个 try/except 块包裹大量无关代码,且捕获所有异常——甚至直接使用裸 except:。
不良示例:
try:
# 大量无关代码
except:
pass # 静默忽略所有错误
这样做的危险之处:
- 隐藏错误:真实的错误被忽略,难以排查。
- 掩盖原因:无法得知实际失败的原因。
- 引发意外行为:程序可能在无效状态下继续运行。
什么时候可以使用广泛异常捕获
捕获所有异常 (except Exception:) 应该是罕见且经过深思熟虑的。
一些可能合适的场合:
- 程序顶层的错误日志记录,避免崩溃并写入日志。
- 关键服务中的容错循环,保证服务持续运行(但仍需日志记录和报告错误)。
- 临时调试时快速查看“是否有任何错误”——但只应作为短期工具。
最佳实践
- 精准捕获:仅捕获你预期并知道如何处理的异常。
- 保持 try 块尽量小:只包裹可能失败的代码,而非整个函数。
- 始终记录或处理异常——不要简单地用 “pass” 忽视异常。
精确处理异常能让代码更易调试、更安全可靠、行为更可预期。
总结
错误处理是Python 编程的基础部分:
- 它防止意外崩溃。
- 它让你优雅地处理问题。
- 它让代码更健壮、可靠和安全。
掌握异常处理、主动抛出自定义错误和使用 finally,你将编写出更适应真实世界环境的程序。