0

我正在使用 smtpd 及其捕获我在 process_message 中引发的 ValueError 异常并将描述打印到 stderr 而不是引发错误。它打印出的是我构造 ValueError 的字符串。

因此,如果我在 process_message 中执行此操作:

raise ValueError("550, This is the error")

我懂了

550, This is the error

在控制台上。我一辈子都找不到导致打印的代码。无论如何都要覆盖 stderr 以在每次打印某些内容时显示堆栈跟踪,或者以其他方式定位哪些代码行正在打印出这些行?

4

1 回答 1

2

您可以用跟踪以下调用的内容替换标准输出流之一write()

import sys
import traceback

class FileTracer(object):
    def __init__(self, out):
        self.out = out

    def write(self, data):
        traceback.print_stack(None, None, sys.__stderr__)
        self.out.write(data)

    def flush(self):
        self.out.flush()

    def close(self):
        self.out.close()

sys.stderr = FileTracer(sys.stderr)

sys.stderr.write("trigger\n")
sys.stderr.flush()

请注意,我__stderr__用来避免循环。

于 2013-07-23T11:38:57.997 回答