Py学习  »  Python

Python中异常处理中的异常

Ang_d • 3 年前 • 1300 次点击  

我试图理解Python如何在异常处理中处理异常。例如,考虑以下内容:

try:
    try:
        1/0
    finally:
        raise Exception("Exception!")
except Exception as e:
    print(e)

我的理解是,这段代码引发的两个异常(ZeroDivisionError和finally块中引发的泛型异常)都应该由外部exception块“处理”。。。但是Python如何决定将哪一个分配给e呢?在我的机器上运行代码时,Python似乎选择将“最近”的异常(在finally块中抛出的异常)分配给e。

这通常是真的吗?另外,在这样的情况下,在错误处理中可能会抛出多个异常,而这些异常都是由一个outer except块处理的,那么outer except块是否有办法分别处理每个错误?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132327
 
1300 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Mark
Reply   •   1 楼
Mark    4 年前

这个 Python docs 有这个:

如果在执行try子句期间发生异常,则 例外情况可以通过except子句处理。如果没有例外 由exception子句处理,在 最后条款已经执行。

因此,在您的示例中,您没有捕获内部异常,这会导致 finally 要执行的块(在重新引发原始异常之前)。中国的例外 最后 在有机会重新引发原始异常之前,将其踢到外部块。外部块从未看到被零除的异常。

这与 return 从中的函数 最后 :

def ex_test():
    try:
        try:
            1/0
        finally:
            return "finally"
    except Exception as e:
        print(e) # never gets here

ex_test()
# only prints "finally"
# never re-raises the exception

可以 获取有关原始异常的一些信息。从…起 the docs :

在exception或finally中引发(或重新引发)异常时 条款 上下文 自动设置为上次捕获的异常; 如果新的异常没有得到处理,那么最终将进行回溯 显示的将包括原始异常和最终异常 例外

所以:

try:
    try:
        1/0
    finally:
        raise Exception("Exception!")
except Exception as e:
    print(e.__context__)

# prints: "division by zero"