ZetCode

Python Try-Except: 异常处理

上次修改时间:2026 年 1 月 15 日

Python 中的 try 关键字用于启动异常处理块,以优雅地管理运行时错误。与 exceptelsefinally 结合使用,它可以通过捕获和处理异常来防止程序崩溃。本教程涵盖了使用实际示例的错误处理技术。

异常处理允许开发人员预测潜在错误并定义恢复流程。 try 块包含可能引发异常的代码,而 except 块处理特定的错误类型。可选的 elsefinally 子句管理成功执行和清理操作。

处理除法错误

此示例演示了除法运算的基本异常处理。

division_error.py
def safe_divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("Error: Division by zero")
        return None
    return result

print(safe_divide(10, 2))  # Output: 5.0
print(safe_divide(5, 0))   # Output: Error: Division by zero, None

try 块尝试除法,而 except 捕获 ZeroDivisionError。当发生无效除法时,该函数返回 None,从而防止程序终止。

捕获多个异常

使用多个 except 子句处理不同的错误类型。

multiple_errors.py
def process_data(value):
    try:
        num = int(value)
        print(100 / num)
    except ValueError:
        print("Invalid integer conversion")
    except ZeroDivisionError:
        print("Cannot divide by zero")

process_data("45")    # Output: 2.222...
process_data("apple") # Output: Invalid integer conversion
process_data("0")     # Output: Cannot divide by zero

单独的 except 块分别处理转换错误和除法错误。 这允许有针对性的错误消息和恢复路径。

使用 Else 子句

仅当 try 块成功时才使用 else 执行代码。

else_clause.py
try:
    with open("data.txt", "r") as f:
        contents = f.read()
except FileNotFoundError:
    print("File not found")
else:
    print("File read successfully")
    print(f"Length: {len(contents)} chars")

只有在 try 块中没有发生异常时,else 块才会运行。 这将错误处理与成功执行逻辑分开。

Finally 用于清理

使用 finally 执行清理代码,无论是否发生异常。

finally_clause.py
try:
    file = open("report.txt", "w")
    file.write("Sample data")
    100 / 0
except ZeroDivisionError:
    print("Division error occurred")
finally:
    file.close()
    print("File resource closed")

即使在除法错误中断写入操作后,finally 块也能确保文件关闭。 这样可以防止资源泄漏。

引发自定义异常

使用 raise 手动触发无效条件的异常。

raise_exception.py
def validate_age(age):
    if age < 0:
        raise ValueError("Age cannot be negative")
    return f"Valid age: {age}"

try:
    print(validate_age(25))
    print(validate_age(-5))
except ValueError as e:
    print(f"Error: {e}")

raise 语句为负年龄创建一个 ValueError。 这会传播错误,以便在封闭的 try-except 块中捕获。

嵌套 Try 块

使用嵌套的 try 语句在不同级别处理异常。

nested_try.py
try:
    try:
        result = 10 / 0
    except ZeroDivisionError:
        print("Inner: Division error")
        raise  # Re-raise the exception
except Exception as e:
    print(f"Outer: Caught {type(e).__name__}")

内部块捕获除法错误并重新引发它以供外部块处理。 这允许分层错误处理和日志记录。

最佳实践

来源

Python 错误和异常文档

本教程探讨了使用 try-except 块的 Python 异常处理。 这些构造使 Python 应用程序能够实现强大的错误管理和资源清理。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程