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 语句后忘记加冒号。

  • 异常:当程序运行时发生的异常状况,例如除以零、访问列表中无效的索引等。

使用 tryexcept 处理异常

处理异常最常用的方法是使用 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,你将编写出更适应真实世界环境的程序。