如何在nose.plugins.base.Plugin.addFailure中获取异常?

时间:2012-08-29 15:48:12

标签: python nose

我正在尝试为nose编写一个插件,它可以为GUI中的某些类型的异常生成并显示其他调试信息。我想在插件中执行此操作的原因是因为我希望仅在给出--enable-gui选项时才启动GUI,并且插件是向鼻子运行器添加命令行选项的唯一方法。 / p>

根据文档,我需要覆盖addFailure(step, err)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__。< / p>

有没有办法从某个地方提取exc_value,比如回溯?

潜在的解决方法:我知道我可以使我的插件成为一个全局变量,而不是处理其中的异常,我可以直接将信息发送到插件本身。不幸的是,这不是一个非常干净的解决方案,所以我想避免它。

为什么我需要一个GUI:我得到的错误是由twisted创建的彩色HTML追踪,无论我是打印HTML还是使用html2text表示,都无法在控制台中显示。

1 个答案:

答案 0 :(得分:0)

错误元组实际上是:(异常类型,实际异常,回溯)。您应该能够从异常或回溯中访问所需的信息。

请注意,在您的代码中,您将所有内容写入字符串:

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

这意味着它确实会被转换成一个字符串,如果我理解正确的话,那就是你在抱怨...