是否可以全局覆盖print()?

时间:2016-06-10 09:45:57

标签: python python-3.x exception-handling override gtk3

我正在调试一个巨大的遗留代码库,实际上是从python2移植到python3。 不幸的是,似乎有一些例外情况需要处理和打印,但是之前的开发人员不够明智地打印堆栈跟踪,这可能告诉我触发了异常的确切位置。

具体来说,我也将代码从GTK + 2移植到GTK + 3,我得到了很多输出行:

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

此时,似乎剩下的唯一选择是全局劫持print()函数,以至少显示在哪个模块和哪个行被调用。

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

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

1 个答案:

答案 0 :(得分:3)

您可以将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