跳到主要内容

Python 异常处理

提示
  1. Python 异常处理:异常处理是为了捕获和处理程序中的异常情况,Python 使用 try...except 代码块来实现异常处理。
  2. 捕获特定异常:Python 允许为不同类型的异常编写不同的 except 代码块,以便针对不同异常采取特定的处理措施。
  3. 使用 try...elsetry...finally:Python 中的 try...else 用于在没有异常时执行特定代码块,而 try...finally 中的代码块始终会被执行,无论是否发生异常。

在上一教程中,我们学习了Python 异常。我们知道异常会异常终止程序的执行。

这就是为什么处理异常很重要。在 Python 中,我们使用 try...except 代码块。

Python 的 try...except 代码块

try...except 代码块用于处理 Python 中的异常。下面是 try...except 代码块的语法:

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 代码块捕获了异常,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 的 try 与 else 子句

在某些情况下,如果 try 代码块内的代码块没有发生任何错误,我们可能希望执行某个代码块。

对于这些情况,您可以在 try 语句中使用可选的 else 关键字。

让我们来看一个例子:

# 程序以打印偶数的倒数
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
追踪 (最近的调用最后一次)
文件 "<string>",行 7,于 <module>
reciprocal = 1/num
ZeroDivisionError: 除以零

注意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 代码块。