2017-03-06 49 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。出於這個原因,在可行的情況下,在全球範圍內宣佈課程。