11

再帰を回避するために何が必要かを理解するには、例外をキャッチする必要があります (編集: Exception から派生したものだけでなく、KeyboardInterrupt やユーザー例外を含むすべての例外)、それを変数に入れ、後で再発生させますcatch ブロックの外側に配置します。基本的に、私は独自の最終ブロックをロールしようとしています。これは可能ですか?

実際の問題は、多数のクリーンアップ関数を呼び出すことです。それらのいずれかが失敗した場合は、他のすべても呼び出す必要があり、失敗した関数の例外は引き続き伝播する必要があります。これが私の現在の解決策です。Popenオブジェクトのリストを取ります:

def cleanupProcs(procs):
    if not procs:
        return

    proc = procs.pop(0)
    try:
        proc.terminate()
        proc.wait()
    finally:
        cleanupProcs(procs)

これを行う反復的な方法はありますか?よりエレガントな方法は?より Pythonic な方法ですか?

4

7 に答える 7

12

スタックトレースを含めたい場合:

try:
    # something
except:
    the_type, the_value, the_traceback = sys.exc_info()

後で

raise the_type, the_value, the_traceback

この回答に関連)

Python 2.7については、こちらも参照してください。

于 2013-10-16T14:29:09.680 に答える
2

私はおそらくBaseException、スローされたものをすべてキャッチし、すべてのクリーンアップ関数を (再帰を使用する代わりに) 反復処理するために使用します。次に、例外をリストに追加して、クリーンアップが終了したときに適切に処理 (再発生、ログなど) します。

def runCleanup(procs):
    exceptions = []
    for proc in procs:
        try:
            proc.terminate()
            proc.wait()
        except BaseException as e:
            exceptions.append(e) # Use sys.exc_info() for more detail

    return exceptions # To be handled or re-raised as needed
于 2013-10-16T18:05:53.623 に答える
1

あなたが使用することができます:

procexceptions = []

except Exception, e:
    procexceptions.append(e)

その後(プロセスを終了するためのループの後)、次のことができます

raise procexceptions[0]

于 2013-10-16T14:33:50.010 に答える
0

Python の他のほとんどすべてと同様に、例外はオブジェクトであるため、名前にバインドして操作できます。例外を取得して後で使用する方法を示す短い例を次に示します。

>>> def to_int(x):
...     try:
...         return int(x)
...     except Exception, e:
...         print 'in exception block:', e
...     print 'after exception block:', e

>>> to_int('12')
12
>>> to_int('abc')
in exception block: invalid literal for int() with base 10: 'abc'
after exception block: invalid literal for int() with base 10: 'abc'
于 2013-10-16T14:29:45.640 に答える
0

簡単だ:

>>> try:
...     #something
... except BaseException, e: # OK. Using BaseException instead of Exception
...     pass
... 
>>> 
>>> raise e
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> 
于 2013-10-16T14:37:54.953 に答える