1

最終的には、次の高レベル構造を持つ短い python ラッパー スクリプトを作成してサポートする必要があります。

try:
    code
    ...
    ...
except:
    raise
finally:
    file_handle.close()
    db_conn.close()

ブロック内で行うことは、スクリプトの呼び出し元sans window-dressingに対してexcept例外を再発生させることだけであることに注意してください。これは私の特定のコンテキストでは問題ではありません。ここでの考え方は、例外の有無にかかわらず、常にブロックを使用してクリーンアップ コードを実行する必要があるということです。finally

atexitこの目的のためにハンドラーを使用したほうがよいでしょうか? によって導入された余分なレベルのインデントなしで行うことができましたtry

4

3 に答える 3

4

このatexitモジュールは、プログラムが正常に終了したときに呼び出される関数を登録するための単純なインターフェイスを提供します。登録された関数は、インタプリタの正常終了時に自動的に実行されます。

import atexit

def cleanup():
    print 'performimg cleanup'

# multiple functions can be registered here...    
atexit.register(cleanup)

sys モジュールもフック sys.exitfunc を提供しますが、そこに登録できる関数は 1 つだけです。

Finallytry exceptの機能は、finallyクリーンアップのようなものにも使用できますが、ブロックではsys.exc_infofinallyはすべてなしです。

finally 句で別の例外が発生した場合、保存された例外は破棄されますが、atexitそれらを処理するために登録された関数に try except を入れることができます。

もう1つpro-conは、atexit関数はプログラムが終了したときにのみ実行されますがfinally、コードのどこでも(try-exceptを使用して)使用してクリーンアップを実行できます

クリーンアップ コンテンツから例外を発生させたいシナリオでatexitは、プログラムの最後にクリーンアップを実行しても問題ない場合は、 の使用が役立ちます。

于 2013-02-14T04:42:13.753 に答える
1

使用するだけcontextlib.closing

with closing(resource1) as f1, closing(resource2) as f2:
    f1.something()
    f2.something()

そして、それらは自動的に閉じられます。ファイルオブジェクトはコンテキストとして直接使用できるため、closing呼び出しは必要ありません。

リソースで使用される方法がそれだけではない場合は、デコレータcloseを使用してカスタム関数を作成できます。contextlib.contextmanager

于 2013-02-14T03:06:33.573 に答える
1

atexitプログラムの終了時に呼び出されるため、これは探しているものではありません。

于 2013-02-14T02:35:38.723 に答える