Python 异常是否进入调用堆栈?

Do Python Exceptions go up the Call stack?

在 Python 中,如果函数 A 调用函数 B,函数 B 调用函数 C,并且函数 C 抛出一个 ValueError(作为示例),错误是否会在调用堆栈中上升,以便函数 A 也抛出 ValueError?因此,例如,我可以在函数 A 中捕获函数 C 的值错误吗?

此外,如果您创建自己的仅在函数 C 中定义的异常,它是否也会进入调用堆栈以便函数 A 抛出相同的错误?

does the error make its way up the call stack so that Function A also throws a ValueError?

我们试试看吧

def a():
    try:
        b()
    except ValueError:
        print("Caught a value error in `a`.")

def b():
    c()

def c():
    raise ValueError

a()

结果:

Caught a value error in `a`.

是的,看起来错误正在调用堆栈中。

what if you create your own Exception that is defined in Function C only, will it also go up the Call stack so that Function A throws the same error?

我们试试看吧

def a():
    try:
        b()
    except:
        print("Caught some kind of exception in `a`.")

def b():
    c()

def c():
    class MyCustomException(Exception):
        pass
    raise MyCustomException

a()

结果:

Caught some kind of exception in `a`.

是的,自定义异常也在调用堆栈中出现。但是您将无法在 a 中执行 except MyCustomException:,因为该名称仅存在于 c 中。因此,在可行的情况下,在全局范围内声明 类。