Pythonの例外を再転ない。どちらをキャッチしますか?
質問
Pythonを使うことを学んでいます。私はちょうどこの記事に出会った: http://nedbatchelder.com/blog/200711/Rethrowing_Exceptions_in_python.html それはこのようにPythonで例外を再ローディングすることを説明しています:
try:
do_something_dangerous()
except:
do_something_to_apologize()
raise
.
例外を再投入するので、Shouoldは「外側のキャッチ」ステートメントになります。しかし今、私は考えていました。以外のDO_SOMECK_TO_APOLOGIZE()がエラーをスローしている場合はどうなります。どちらがアウターに巻き込まれます。あなたがrethrowまたはdo_something_to_apologize()によってスローされたもの? または最高のプリティルリーの例外は最初に捕まえられますか?
解決
試してみて:
def failure():
raise ValueError, "Real error"
def apologize():
raise TypeError, "Apology error"
try:
failure()
except ValueError:
apologize()
raise
.
結果:
Traceback (most recent call last):
File "<pyshell#14>", line 10, in <module>
apologize()
File "<pyshell#14>", line 5, in apologize
raise TypeError, "Apology error"
TypeError: Apology error
.
理由:元の関数からの「実際の」エラーはすでにexcept
によって捕捉されていました。 apologize
は、raise
に達する前に新しいエラーを発生させます。したがって、raise
句のexcept
は実行されません。謝罪の誤差のみが上方に伝播します。 apologize
がエラーを発生させると、Pythonにはapologize
の後に別の例外が発生しようとしていたことを知っていない方法はありません。
Python 3では、トレースバックは例外の両方に例外を説明します。
Traceback (most recent call last):
File "./prog.py", line 9, in <module>
File "./prog.py", line 2, in failure
ValueError: Real error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./prog.py", line 11, in <module>
File "./prog.py", line 5, in apologize
TypeError: Apology error
.
しかしながら、2番目の例外(「謝罪」例外)はまだ外側に伝播し、より高いレベルのexcept
句によって捕捉され得る唯一のものです。元の例外はトレースバックに記載されていますが、後の1つにはサンシニングされており、もうキャッチできなくなります。
他のヒント
DO_SOMESHENT_TO_APOLOGIZE()によってスローされた例外が捉えられます。RASEを含む行は、do_someth_to_apologyによってスローされた例外のために実行されません。また、Pythonの例外に「優先」という考え方があるとは思わない。