2017-03-06 51 views
0

在Python中,如果函数A调用函数B,并且函数B调用函数C,并且函数C抛出一个ValueError(作为示例),那么错误是否会在调用堆栈上向上,从而函数A也会抛出ValueError?例如,我可以从函数A中的函数C捕获值错误吗?Python异常会进入调用堆栈吗?

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

+7

你试过了吗? –

+2

你在这里问的是一件简单的事情,你可以检查自己。 – itzMEonTV

+0

我想知道异常的概念如何在不传递堆栈的情况下工作。 –

回答

1

错误是否使调用堆栈的方式,使函数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`. 

是的,看起来像错误使得它的方式调用堆栈。

如果您创建了自己的仅在函数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`. 

是的,自定义异常使他们的方式调用堆栈过。但是你不能在a中做except MyCustomException:,因为这个名字只存在于c。出于这个原因,在可行的情况下,在全球范围内宣布课程。