質問

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の例外に「優先」という考え方があるとは思わない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top