由于异常会异常地中止程序的执行,因此对异常进行处理非常重要。在 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 中 try 与 else 子句
在某些情况下,我们可能希望在 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 块。