Python 简明教程
Python - Nested try Block
Nested try Block in Python
在一个Python程序中,如果另一个 try-except 构造位于 try 块或其 except 块内,则称为嵌套try块。当不同的块(如外部块和内部块)可能导致不同的错误时,就需要这样做。为了处理它们,我们需要嵌套的try块。
我们从一个具有单个“try - except- finally”构造的示例开始。如果try内部的语句遇到异常,它将由except块处理。无论是否发生异常,finally块总是执行。
Example 1
在这里, try 块有“除以 0”的情况,因此 except 块派上用场了。它配备了一致处理带有 Exception 类的通用异常。
a=10
b=0
try:
print (a/b)
except Exception:
print ("General Exception")
finally:
print ("inside outer finally block")
它将生成以下 output −
General Exception
inside outer finally block
Example 2
我们现在来看如何嵌套 try 结构。我们在现有的 try 块中放置另一个“try − except − finally”块。内部 try 的 except 关键词现在处理通用异常,而我们要求外部 try 的 except 块处理 ZeroDivisionError。
因为 try 块中没有发生异常,所以不会调用其对应的通用 Except。由外部 except 从句处理除以 0 的情况。
a=10
b=0
try:
print (a/b)
try:
print ("This is inner try block")
except Exception:
print ("General exception")
finally:
print ("inside inner finally block")
except ZeroDivisionError:
print ("Division by 0")
finally:
print ("inside outer finally block")
它将生成以下 output −
Division by 0
inside outer finally block
Example 3
现在,我们逆转这种情况。在嵌套的 try 块之外,外部块没有任何异常引发,但是导致除以 0 的语句在内部 try 内,因此由内部 except 块处理异常。显然,将不会调用对应于外部 try 的 except 部分。
a=10
b=0
try:
print ("This is outer try block")
try:
print (a/b)
except ZeroDivisionError:
print ("Division by 0")
finally:
print ("inside inner finally block")
except Exception:
print ("General Exception")
finally:
print ("inside outer finally block")
它将生成以下 output −
This is outer try block
Division by 0
inside inner finally block
inside outer finally block
最后,我们来讨论在嵌套块中可能发生的另一种情况。虽然在外部 try 中没有异常,但是没有合适的 except 块来处理内部 try 中的异常。
Example 4
在以下示例中,内部 try 面临“除以 0”,但其对应的 except: 寻找 KeyError 而不是 ZeroDivisionError。因此,异常对象会传递给后续 except 语句的 except: 块,该 except 语句与外部 try: 语句相匹配。在那里,zeroDivisionError 异常被捕获并处理。
a=10
b=0
try:
print ("This is outer try block")
try:
print (a/b)
except KeyError:
print ("Key Error")
finally:
print ("inside inner finally block")
except ZeroDivisionError:
print ("Division by 0")
finally:
print ("inside outer finally block")
它将生成以下 output −
This is outer try block
inside inner finally block
Division by 0
inside outer finally block