2

GUIで特定の種類の例外に関する追加のデバッグ情報を生成および表示するnose用のプラグインを作成しようとしています。これをプラグインで実行したい理由は、--enable-guiオプションが指定された場合にのみ GUI を起動したいからです。プラグインはコマンドライン オプションをノーズ ランナーに追加する唯一の方法です。

addFailure(step, err)ドキュメントによると、 andをオーバーライドする必要があり、それがタプルaddError(step, err)であると言われています。errsys.exc_info()

http://nose.readthedocs.org/en/latest/plugins/interface.html

残念ながら、私はまったく別のものを得ています.例外は、それを表す文字列値に置き換えられます. これが私のコードです:

def addError(self, test, err):
    info = ', '.join((type(x).__name__) for x in err)
    open('/tmp/xxxxx', 'a').write(info + '\n')

def addFailure(self, test, err):
    info = ', '.join((type(x).__name__) for x in err)
    open('/tmp/xxxxx', 'a').write(info + '\n')

出力は次のとおりです。

type, str, traceback
type, str, traceback

だから、代わりにexc_type, exc_value, exc_tb、私は得てexc_type, str(exc_value), exc_tbいます。

オーバーライドされたメソッドへの呼び出しのスタックは次のとおりです。

Traceback (most recent call last):
  File "runtests.py", line 6, in <module>
    nose.main(module=tests, addplugins=tests.plugins.get_all_plugins())
  File "/usr/lib/python2.7/dist-packages/nose/core.py", line 118, in __init__
    **extra_args)
  File "/usr/lib/python2.7/unittest/main.py", line 95, in __init__
    self.runTests()
  File "/usr/lib/python2.7/dist-packages/nose/core.py", line 197, in runTests
    result = self.testRunner.run(self.test)
  File "/usr/lib/python2.7/dist-packages/nose/core.py", line 61, in run
    test(result)
  File "/usr/lib/python2.7/dist-packages/nose/suite.py", line 176, in __call__
    return self.run(*arg, **kw)
  File "/usr/lib/python2.7/dist-packages/nose/suite.py", line 223, in run
    test(orig)
  File "/usr/lib/python2.7/dist-packages/nose/suite.py", line 176, in __call__
    return self.run(*arg, **kw)
  File "/usr/lib/python2.7/dist-packages/nose/suite.py", line 223, in run
    test(orig)
  File "/usr/lib/python2.7/dist-packages/nose/suite.py", line 176, in __call__
    return self.run(*arg, **kw)
  File "/usr/lib/python2.7/dist-packages/nose/suite.py", line 223, in run
    test(orig)
  File "/usr/lib/python2.7/dist-packages/nose/case.py", line 45, in __call__
    return self.run(*arg, **kwarg)
  File "/usr/lib/python2.7/dist-packages/nose/case.py", line 138, in run
    result.addError(self, err)
  File "/usr/lib/python2.7/dist-packages/nose/proxy.py", line 134, in addError
    plugins.addError(self.test, err)
  File "/usr/lib/python2.7/dist-packages/nose/plugins/manager.py", line 94, in __call__
    return self.call(*arg, **kw)
  File "/usr/lib/python2.7/dist-packages/nose/plugins/manager.py", line 162, in simple
    result = meth(*arg, **kw)
  File "<snip>/plugins.py", line 31, in addError
    open('/tmp/xxxxx', 'a').write(info + '\n')

から例外を抽出できませんsys.exc_info()。これは、既に別の例外に置き換えられているためです (特に、発生した例外のUnicodeEncodeError中にキャッチされ__str__たもの)。

exc_valueトレースバックなど、どこかから抽出する方法はありますか?

潜在的な回避策: プラグインをグローバル変数にすることができることを知っています。その中で例外を処理する代わりに、情報をプラグイン自体に直接送信できます。残念ながら、それはあまりきれいな解決策ではないので、避けたいと思います。

GUI が必要な理由: 表示されるエラーは、twisted によって作成された色付きの HTML トレースバックです。これは、HTML を印刷しているかhtml2text表現を使用しているかに関係なく、コンソールで読み取ることができません。

4

1 に答える 1

0

errタプルは実際には(例外タイプ、実際の例外、トレースバック) です。例外またはトレースバックから必要な情報にアクセスできるはずです。

コードでは、すべてを文字列に書き込むことに注意してください。

info = ', '.join((type(x).__name__) for x in err)

これは、実際に文字列にキャストされることを意味します。私が正しく理解していれば、それはあなたが不平を言っていることです...

于 2012-12-18T08:06:59.427 に答える