我正在使用smtpd及其捕获在process_message中引发的ValueError异常,并将描述打印到stderr,而不是引发错误。它打印出来的是我用来构造ValueError的字符串。
所以如果我在process_message:中这样做
raise ValueError("550, This is the error")
我看到
550, This is the error
在控制台上。我一辈子都找不到是什么代码导致了打印。是否有任何方法可以覆盖stderr,以便在每次打印内容时显示堆栈跟踪,或者以其他方式定位打印这些行的代码行?
您可以用跟踪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("triggern")
sys.stderr.flush()
请注意,我使用__stderr__
来避免循环。