1

トレースバックプリントがあり、その最後の部分をカスタマイズしたいと思います。

  • 内容:エラーは別のプロセスで発生し、トレースバックはそこにあります(マルチプロセッシングの場合のように)。
  • 問題:完全なトレースバックとエラーレポートが必要です。

このコードに似ています:

>>> def f():
    g()

>>> def g():
    raise Exception, Exception(), None ## my traceback here

>>> f()

Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    f()
  File "<pyshell#8>", line 2, in f
    g()
  File "<pyshell#11>", line 2, in g
    raise Exception, Exception(), None ## my traceback starts here
my traceback appears here
my traceback appears here

Exception

不可能な「ソリューション」:サブクラスとモックオブジェクト

>>> from types import *
>>> class CostomTB(TracebackType):
    pass


Traceback (most recent call last):
  File "<pyshell#125>", line 1, in <module>
    class CostomTB(TracebackType):
TypeError: Error when calling the metaclass bases
    type 'traceback' is not an acceptable base type
>>> class CostomTB(object):
    pass

>>> try: zzzzzzzzz
except NameError:
    import sys
    ty, err, tb = sys.exc_info()
    raise ty, err, CostomTB()


Traceback (most recent call last):
  File "<pyshell#133>", line 5, in <module>
    raise ty, err, CostomTB()
TypeError: raise: arg 3 must be a traceback or None

私はPython2.7を使用しています。

4

2 に答える 2

1

完全なトレースバック スタックが必要だと思います。非常に良い例python logging moduleを持っている this を参照してください。
混乱が生じた場合は、ロギングのドキュメントを参照してください。

于 2012-08-09T21:51:05.687 に答える
0

別のプロセスについておっしゃいました。問題がプロセスAでトレースバックをキャプチャし、プロセスBでそれを表示することである場合、例外が実際に後者で発生したかのように、それを行うためのクリーンな方法はないのではないかと思います。

プロセスAでトレースバックをシリアル化し、プロセスBに送信して、そこから前者を説明に含む新しい例外を発生させることをお勧めします。結果はやや長い出力になりますが、両方のプロセススタックに関する情報が含まれます。

次の例では、実際には2つの別個のプロセスはありませんが、私のポイントがより明確になることを願っています。

import traceback, StringI

def functionInProcessA():
    raise Exception('Something happened in A')

class RemoteException(Exception):
    def __init__(self, tb):
        Exception.__init__(self, "Remote traceback:\n\n%s" % tb)

def controlProcessB():
    try:
        functionInProcessA()
    except:
        fd = StringIO.StringIO()
        traceback.print_exc(file=fd)
        tb = fd.getvalue()
        raise RemoteException(tb)

if __name__ == '__main__':
    controlProcessB()

出力:

Traceback (most recent call last):
  File "a.py", line 20, in <module>
    controlProcessB()
  File "a.py", line 17, in controlProcessB
    raise RemoteException(tb)
__main__.RemoteException: Remote traceback:

Traceback (most recent call last):
  File "a.py", line 12, in controlProcessB
    functionInProcessA()
  File "a.py", line 4, in functionInProcessA
    raise Exception('Something happened in A')
Exception: Something happened in A
于 2012-08-10T08:26:40.117 に答える