Python 嵌套的try块
在Python程序中,如果在try块内部或其except块内部有另一个try-except结构,则称为嵌套的try块。当外部和内部之间可能导致不同错误的块时,就需要使用嵌套try块来处理它们。
我们从一个具有单个”try-except-finally”结构的示例开始。如果try块内的语句遇到异常,将由except块处理。无论是否发生异常,finally块总是会执行。
示例1
在这里,try块出现了”division by 0″的情况,因此except块介入。它能够处理使用Exception类的通用异常。
a=10
b=0
try:
print (a/b)
except Exception:
print ("General Exception")
finally:
print ("inside outer finally block")
它将产生以下 输出 −
General Exception
inside outer finally block
示例2
现在让我们看看如何嵌套 try 结构。我们在现有的try块内放置另一个”try-except-finally”块。内部try的except关键字现在处理一般的异常,而我们要求外部try的except块处理ZeroDivisionError。
由于内部 try 块中没有发生异常,它对应的一般Except未被调用。除0的情况由外部except子句处理。
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")
它将产生以下 输出 −
Division by 0
inside outer finally block
示例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")
它将会产生以下的 输出 −
This is outer try block
Division by 0
inside inner finally block
inside outer finally block
最后,让我们讨论另一种可能发生的情况,这种情况可能发生在嵌套块中。虽然外部 try 块中没有任何异常,但内部 try 块中没有合适的异常处理块来处理它。
示例4
在下面的例子中,内部 try 块遇到了”division by 0″的异常,但它对应的异常处理块却寻找的是KeyError而不是ZeroDivisionError。因此,异常对象传递给了与外部 try 语句匹配的后续异常处理块的except:块。在那里,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")
它将产生以下 输出 −
This is outer try block
inside inner finally block
Division by 0
inside outer finally block