Pythonでは、関数Aが関数Bを呼び出し、関数Bが関数Cを呼び出し、関数CがValueErrorをスローすると(例として)、関数AはValueErrorをスローするようにエラーを呼び出しスタックに渡しますか?したがって、たとえば、関数Aの関数Cから値の誤差をキャッチすることはできますか?Python例外が呼び出しスタックを上回るか?
また、関数Cで定義されている独自の例外を作成すると、関数Aが同じエラーをスローするように呼び出しスタックにも移動しますか?
Pythonでは、関数Aが関数Bを呼び出し、関数Bが関数Cを呼び出し、関数CがValueErrorをスローすると(例として)、関数AはValueErrorをスローするようにエラーを呼び出しスタックに渡しますか?したがって、たとえば、関数Aの関数Cから値の誤差をキャッチすることはできますか?Python例外が呼び出しスタックを上回るか?
また、関数Cで定義されている独自の例外を作成すると、関数Aが同じエラーをスローするように呼び出しスタックにも移動しますか?
エラーがコールスタックを上回るため、関数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
にのみ存在します。このため、実際には、クラスをグローバルスコープで宣言します。
試しましたか? –
あなたがここで尋ねたのは、自分で確認できる簡単なことです。 – itzMEonTV
私はスタックの上に渡されることなく、例外の概念がどのように機能するのだろうと思っています。 –