在上一篇教程中,我们学习了 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
块。
另请阅读