2017-03-06 11 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`. 

うん、カスタム例外もコールスタックまで自分の道を作ります。しかしexcept MyCustomException:aに入れることはできません。その名前はcにのみ存在します。このため、実際には、クラスをグローバルスコープで宣言します。

関連する問題