在上一篇教程中,我们学习了 Python 异常。我们知道异常会异常终止程序的执行。
由于异常会异常终止程序的执行,因此处理异常非常重要。在 Python 中,我们使用 try...except 块来处理异常。
Python try...except 块
try...except 块用于在 Python 中处理异常。以下是 try...except 块的语法
try:
# code that may cause exception
except:
# code to run when exception occurs
在这里,我们将可能生成异常的代码放在 try 块内部。每个 try 块后面都有一个 except 块。
当异常发生时,它会被 except 块捕获。except 块不能在没有 try 块的情况下使用。
示例:使用 try...except 进行异常处理
try:
numerator = 10
denominator = 0
result = numerator/denominator
print(result)
except:
print("Error: Denominator cannot be 0.")
# Output: Error: Denominator cannot be 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("Denominator cannot be 0.")
except IndexError:
print("Index Out of Bound.")
# Output: Index Out of Bound
在此示例中,我们创建了一个名为 even_numbers 的 列表。
由于列表索引从 0 开始,因此列表的最后一个元素位于索引 3 处。请注意以下语句:
print(even_numbers[5])
在这里,我们尝试访问索引 5 的值。因此,会发生 IndexError 异常。
当 try 块中发生 IndexError 异常时,
ZeroDivisionError异常被跳过。- 执行
IndexError异常内部的代码集。
带 else 子句的 Python try
在某些情况下,如果 try 中的代码块在没有任何错误的情况下运行,我们可能希望运行某个代码块。
对于这些情况,您可以将可选的 else 关键字与 try 语句一起使用。
我们来看一个例子
# program to print the reciprocal of even numbers
try:
num = int(input("Enter a number: "))
assert num % 2 == 0
except:
print("Not an even number!")
else:
reciprocal = 1/num
print(reciprocal)
输出
如果我们传入一个奇数
Enter a number: 1 Not an even number!
如果我们传入一个偶数,则计算并显示倒数。
Enter a number: 4 0.25
但是,如果我们传入 0,我们会得到 ZeroDivisionError,因为 else 内部的代码块未被前面的 except 处理。
Enter a number: 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("Error: Denominator cannot be 0.")
finally:
print("This is finally block.")
输出
Error: Denominator cannot be 0. This is finally block.
在上面的示例中,我们在 try 块内将一个数字除以 0。这会生成一个异常。
异常被 except 块捕获。然后,执行 finally 块。
另请阅读
