2016-06-10 104 views
0

我正在调试一个庞大的遗留代码库,实际上是将它从python2移植到python3。 不幸的是,有些例外似乎是被处理和打印出来的,但是之前的开发人员不够明智,无法打印堆栈跟踪,这可以告诉我在哪里触发了异常。是否可以在全局覆盖print()?

具体来说,我也是从GTK移植代码+ 2 GTK + 3,我得到许多这些输出线:

TypeError: expose() missing 1 required positional argument: 'event' 

在这一点上,它似乎是唯一的选择就是在全球范围内劫持print()函数以至少显示哪个模块以及它被调用的是哪一行。

你知道python3中可能吗? (我是python2的老手,但是python3的新手)

关于如何解决这个问题的其他建议?

+1

http://stackoverflow.com/a/10106489/2141635 –

+0

@PadraicCunningham:它不起作用。看起来,该代码是为python2而设计的,而我正在使用python3,正如我在我的文章中所写的那样。 – fstab

+0

你确定代码调用'print()'而不仅仅是做某种类型的日志?你可以在所有的“try/except”块中加一个'raise'。 –

回答

2

您可以将sys.stdoutsys.stderr重新映射到重写的类文件对象,并且每当写入内容时,检查当前是否在异常帧内,如果是,则重新引发异常。

import io 
import sys 


class Stream(io.StringIO): 

    def write(*args, **kwargs): 
     if sys.exc_info()[0] is not None: 
      raise 
     super().write(*args, **kwargs) 

stream = Stream() 
sys.stdout = stream 
sys.stderr = stream