3

ファイルに対して実行する必要のあるすべての操作が成功しなかった場合(つまり、例外が発生した場合)は、ファイルを削除する必要があります。を使用するのと同じくらい簡単で、ファイルを削除してから例外を再発生させることもできますが、その場合、なんらかの理由でファイルをexcept句で削除できないと、元の例外が失われます。

私が思いついた最高のものはこれです:

try:
    file_path = "whatever.jpg"
    # do stuff with file
except:
    exception_raised = True
    raise
finally:
    try:
        if exception_raised:
            os.unlink(file_path)
    except:
        pass

return file_path   # everything OK

より良い、よりPythonicなアプローチを知っている人はいますか?

4

1 に答える 1

5

もう1つのオプションは、例外を失いたくない場合は、単に例外を保存することです。

Python 3.xバージョン:

try:
    file_path = "whatever.jpg"
    # do stuff with file
except BaseException as e:
    try:
        os.unlink(file_path)
    except Exception:
        traceback.print_exc()
    raise e

Python 2.xバージョンは、完全な例外情報を手動で保存する必要があるため、少し複雑です(そうしないと、トレースバックが失われます)。

try:
    file_path = "whatever.jpg"
    # do stuff with file
except:
    e = sys.exc_info()
    try:
        os.unlink(file_path)
    except Exception:
        traceback.print_exc()
    raise e[0], e[1], e[2]

編集:キャッチしたくないので、ここでキャッチしたくないのでException、内側のブロックのサブクラスのみをキャッチします。また、単にドロップするのではなく、リンク解除中に発生した例外を報告します。trySystemExitKeyboardInterrupt

于 2011-10-07T12:26:49.780 に答える