Python 异常处理

更新于 2026-01-12

由于异常会异常地中止程序的执行,因此对异常进行处理非常重要。在 Python 中,我们使用 try...except 语句块来处理异常。

Python 的 try...except 语句块

try...except 语句块用于在 Python 中处理异常。其语法如下:

try:
    # 可能引发异常的代码
except:
    # 异常发生时要运行的代码

在这里,我们将可能产生异常的代码放在 try 块中。每个 try 块后面必须跟一个 except 块。

当异常发生时,它会被 except 块捕获。except 块不能在没有 try 块的情况下单独使用。

示例:使用 try...except 进行异常处理

try:
    numerator = 10
    denominator = 0

    result = numerator / denominator

    print(result)
except:
    print("错误:分母不能为 0。")

输出:

错误:分母不能为 0。

在这个例子中,我们尝试用一个数除以 0。这段代码会引发一个异常。

为了处理该异常,我们将 result = numerator / denominator 放在了 try 块中。当异常发生时,try 块中剩余的代码将被跳过。

except 块会捕获该异常,并执行其中的语句。

如果 try 块中的任何语句都没有引发异常,则 except 块会被跳过。

在 Python 中捕获特定类型的异常

每个 try 块可以有零个或多个 except 块。多个 except 块允许我们以不同的方式处理每种异常。

每个 except 块的参数类型表示它可以处理的异常类型。例如:

try:
    even_numbers = [2, 4, 6, 8]
    print(even_numbers[5])

except ZeroDivisionError:
    print("分母不能为 0。")
    
except IndexError:
    print("索引超出范围。")

输出:

索引超出范围。

在此示例中,我们创建了一个名为 even_numbers 的列表。

由于列表索引从 0 开始,该列表的最后一个元素位于索引 3。注意以下语句:

print(even_numbers[5])

这里我们试图访问索引为 5 的值,因此会引发 IndexError 异常。

try 块中发生 IndexError 异常时:

  • ZeroDivisionError 的处理块会被跳过;
  • IndexError 对应的代码块会被执行。

Python 中 tryelse 子句

在某些情况下,我们可能希望在 try 块中的代码未发生任何错误时,运行某个特定的代码块。

对于这种情况,你可以使用可选的 else 关键字配合 try 语句。

看下面这个例子:

# 打印偶数的倒数的程序

try:
    num = int(input("请输入一个数字:"))
    assert num % 2 == 0
except:
    print("这不是一个偶数!")
else:
    reciprocal = 1 / num
    print(reciprocal)

运行结果:

如果我们输入一个奇数:

请输入一个数字:1
这不是一个偶数!

如果我们输入一个偶数,则会计算并显示其倒数:

请输入一个数字:4
0.25

然而,如果我们输入 0,会得到 ZeroDivisionError,因为 else 块中的代码并未被前面的 except 块处理:

请输入一个数字:0
Traceback (most recent call last):
  File "<string>", line 7, in <module>
    reciprocal = 1/num
ZeroDivisionError: division by zero

这里的 assert 语句用于检查 num 是否为偶数;如果 num 是奇数,就会抛出 AssertionError,从而触发 except 块。

注意else 子句中发生的异常不会被前面的 except 子句处理。

Python 的 try...finally 语句

在 Python 中,无论是否发生异常,finally 块总是会被执行。

finally 块是可选的。每个 try 块最多只能有一个 finally 块。

看下面的例子:

try:
    numerator = 10
    denominator = 0

    result = numerator / denominator

    print(result)
except:
    print("错误:分母不能为 0。")
    
finally:
    print("这是 finally 块。")

输出:

错误:分母不能为 0。
这是 finally 块。

在上面的例子中,我们在 try 块中用一个数除以 0,这会引发异常。

该异常被 except 块捕获,然后执行 finally 块。