Python 异常处理

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


另请阅读

视频:Python 异常处理 (try..except..finally)

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战