17

multiprocessing モジュールを介して実行される関数内で例外が発生した場合に、スタック トレースを取得する最良の方法について疑問に思っています。次に例を示します。

import multiprocessing

def square(x):
    raise Exception("Crash.")
    return x**2

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    results = pool.map_async(square, range(5))
    for result in results.get():
        print result

これは以下を出力します:

Traceback (most recent call last):
  File "/extra/workspace/Playground/src/multiproc/multiproc_debug.py", line 11, in <module>
    for result in results.get():
  File "/extra/Python 2.6/lib/python2.6/multiprocessing/pool.py", line 422, in get
    raise self._value
Exception: Crash.

そのため、有用なスタック トレースがなく、非常に面倒です。これに対する私の現在の解決策:

import multiprocessing
import traceback

def square(x):
    try:
        # some more code...
        raise Exception("Crash.")
    except Exception, exception:
        print exception
        traceback.print_exc()
        raise
    return x**2

すべての定型コードなしでこの動作を取得する方法はありますか? そうでない場合、この機能を含めない理由は何ですか?

編集:定型コードにデコレータを使用できますが、そのようなデコレータが標準ライブラリに含まれているかどうかはわかりませんか?

4

3 に答える 3

11

メイン関数から例外を発生させないようにする必要があるようです。代わりに、それをキャッチし、メイン プログラムに返される値として扱い、そこで発生させることができます。 Python での例外の再スローに詳細があります。

于 2009-12-10T15:21:13.830 に答える
4

Python 3.4 では、完全なトレースバックが提供されます。

http://bugs.python.org/issue13831

于 2014-07-14T16:16:07.007 に答える