0

いくつかの例外をキャッチしたいコードサンプルを以下に示します。

メイン関数で:

try:
    ...
    do_something()
except some_exception,e:
    do_some_other_thing

do_something関数で

try:
    ...
except some_exception,e:
    do_some_other_thing

それで、私がそれをテストしていたとき、例外が 2 回 (関数do_somthing()で 1 回、main関数で 1 回) 処理されていることに気付きました。私の観察は正確ですか?

その関数によってのみキャプチャされない例外をキャッチする方法はありますか? キャッチしたい 2 つのシナリオがあり、それらは同じ例外処理クラス (つまりsome_exception)に多少ラップされているためです。

4

2 に答える 2

1

試してみて、簡単なテストで何が起こるか見てみませんか?

def main():
    try:
        raise ValueError("in main!")
    except ValueError as e:
        print "caught exception",str(e)
        #for fun, re-run with the next line uncommented and see what happens!
        #raise

try:
    main()
except ValueError:
    print "caught an exception above main"

このコードを実際に試してみると、(関数内で)1つのメッセージしか出力されないことに気付くでしょう。これは、例外がキャッチされると( except句でmain再実行しない限り)例外が上向きに伝播しないことを示しています。raise

于 2012-12-17T21:08:43.000 に答える
1

あなたの観察は不正確です。を上げる場所が2つある必要があります。そうsome_exeptionでない場合は、明示的に再上げます。

例外が正しくキャッチされると、スタックの上位にある他のハンドラーによって例外がキャッチされることはありません。

これは、少しのデモンストレーションで最も簡単に示されます。

>>> try:
...     try:
...         raise AttributeError('foo')
...     except AttributeError as e:
...         print 'caught', e
... except AttributeError as e:
...     print 'caught the same exception again?', e
... 
caught foo

内部 exceptハンドラーのみが呼び出されました。一方、例外を再発生させた場合は、両方のハンドラーがメッセージを出力するのがわかります。

>>> try:
...     try:
...         raise AttributeError('foo')
...     except AttributeError as e:
...         print 'caught', e
...         raise e
... except AttributeError as e:
...     print 'caught the same exception again?', e
... 
caught foo
caught the same exception again? foo

そのため、「関数によってキャッチされない例外」を処理する必要はありません。以前にキャッチされていない例外のみを処理する必要があります。

于 2012-12-17T21:08:54.463 に答える