Python异常是否会调用Call堆栈?

时间:2017-03-06 15:15:52

标签: python error-handling callstack

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

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

1 个答案:

答案 0 :(得分:3)

  

错误是否会在调用堆栈中向上移动,以便函数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`.

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

  

如果你创建自己的Exception只在Function 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()

结果:

Caught some kind of exception in `a`.

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