【问题标题】:Exception handling within exception异常中的异常处理
【发布时间】:2020-06-26 12:34:05
【问题描述】:

所以我有两个不同的 try-except 块,我不理解输出,我相信这是因为 except 块中的异常。尽管我发现了一些标题相似的问题,但它们并没有帮助我回答我的问题。

第一块:

try:
    try:
        raise IndexError
        x = 5/0
    except ArithmeticError:
        print("1")
        print("2")
    except IndexError:
        print("3")
    finally:
        print("4")
except:
    print("5")                #Output: 3 4

既然我们捕获了IndexError,为什么最后一个异常5? (我确实理解 raise IndexError 被第二个捕获,除了我们得到 3,因为 finally 总是被执行,4 也被打印出来了)。

第二个(相关)问题:

try:
    try:
        x = 5/0
    except ArithmeticError:
        print("1")
        raise IndexError            # this is different this time!
        print("2")
    except IndexError:
        print("3")
    finally:
        print("4")
except:
    print("5")                      #Output: 1 4 5

raise IndexError 不执行print("3") 语句是怎么回事?既然我们在第一个示例中没有得到它,为什么这次我们得到了 5 输出?

【问题讨论】:

    标签: python-3.x exception error-handling try-catch


    【解决方案1】:

    except 将捕获在try 中抛出的异常,但不会 在其他兄弟except 块中。对于具有多个兄弟except 块的任何给定try,这些except 块中的一个 将处理异常。

    在您的第一个示例中,5 未打印,因为外部 try 中的代码不会引发异常。内部try 中的异常被抛出,并由该级别的except 块之一处理。

    在您的第二个示例中,3 未打印,因为try 块中的代码不会引发IndexError。它抛出一个ArithmeticError,被相应的except 块捕获。 那个块也会抛出一个异常,该异常存在于整个try/except结构中,并被更高的except块捕获。

    【讨论】:

    • 哦,我知道我今天应该暂停一下。第一个例子完全清楚。但是非常感谢您对第二个示例的解释。说清楚了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多