在 Python 程序中,如果在一个 try
块或其 except
块内部有另一个 try-except
结构,这就被称为嵌套 try 块。当不同的块如外部和内部块可能会导致不同的错误时,就需要用到嵌套 try 块。为了处理它们,我们需要嵌套的 try 块。
我们先从一个具有单一 “try - except - finally” 构造的例子开始。如果 try 内部的语句遇到异常,则由 except 块处理。无论是否发生异常,finally 块总是被执行。
示例 1
在这里,try 块有一个“除以 0”的情况,因此 except 块开始发挥作用。它配备了使用 Exception 类来处理通用异常。
a = 10
b = 0
try:
print(a / b)
except Exception:
print("通用异常")
finally:
print("在外层 finally 块内")
它将产生以下输出:
通用异常
在外层 finally 块内
示例 2
现在让我们看看如何嵌套 try 构造。我们在现有的 try 块内部放入另一个 “try - except - finally” 块。内部 try 的 except 关键字现在处理通用的 Exception,而我们要求外层 try 的 except 块处理 ZeroDivisionError。
由于内部 try 块没有发生异常,其对应的通用 Except 未被调用。除以 0 的情况由外层 except 子句处理。
a = 10
b = 0
try:
print(a / b)
try:
print("这是内部 try 块")
except Exception:
print("通用异常")
finally:
print("在内部 finally 块内")
except ZeroDivisionError:
print("除以 0")
finally:
print("在外层 finally 块内")
它将产生以下输出:
除以 0
在外层 finally 块内
示例 3
现在我们反转这种情况。在嵌套的 try 块中,外层的没有引发任何异常,但是引起除以 0 的语句位于内部 try 块中,因此异常由内部 except 块处理。显然,对应于外层 try: 的 except 部分不会被调用。
a = 10
b = 0
try:
print("这是外层 try 块")
try:
print(a / b)
except ZeroDivisionError:
print("除以 0")
finally:
print("在内部 finally 块内")
except Exception:
print("通用异常")
finally:
print("在外层 finally 块内")
它将产生以下输出:
这是外层 try 块
除以 0
在内部 finally 块内
在外层 finally 块内
示例 4
最后,让我们讨论一下在嵌套块中可能出现的另一种情况。虽然在外层 try: 中没有任何异常,但是在内部 try: 块中也没有合适的 except 块来处理。在下面的例子中,内部 try: 面临“除以 0”,但其相应的 except: 寻找的是 KeyError 而不是 ZeroDivisionError。因此,异常对象被传递给匹配外层 try: 语句的后续 except: 块。在那里,ZeroDivisionError 异常被捕获并处理。
a = 10
b = 0
try:
print("这是外层 try 块")
try:
print(a / b)
except KeyError:
print("键错误")
finally:
print("在内部 finally 块内")
except ZeroDivisionError:
print("除以 0")
finally:
print("在外层 finally 块内")
它将产生以下输出:
这是外层 try 块
在内部 finally 块内
除以 0
在外层 finally 块内