Python 异常会在调用堆栈中上升吗?

sam*_*ore 2 python error-handling callstack

在 Python 中,如果函数 A 调用函数 B,函数 B 调用函数 C,而函数 C 抛出一个 ValueError(作为示例),错误是否会沿着调用堆栈向上移动,从而函数 A 也抛出一个 ValueError?例如,我可以从函数 A 中的函数 C 中捕获值错误吗?

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

Kev*_*vin 5

错误是否会进入调用堆栈,以便函数 A 也抛出 ValueError?

让我们试试看。

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

def b():
    c()

def c():
    raise ValueError

a()
Run Code Online (Sandbox Code Playgroud)

结果:

Caught a value error in `a`.
Run Code Online (Sandbox Code Playgroud)

是的,看起来错误会在调用堆栈中上升。

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

让我们试试看。

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()
Run Code Online (Sandbox Code Playgroud)

结果:

Caught some kind of exception in `a`.
Run Code Online (Sandbox Code Playgroud)

是的,自定义异常也会进入调用堆栈。但是你不能except MyCustomException:在 in中做a,因为那个名字只存在于c. 因此,在可行的情况下,在全局范围内声明类。