2013-07-23 33 views
0

我正在使用smtpd及其捕獲的ValueError異常,我在process_message中引發並將描述打印到stderr而不是引發錯誤。 它打印出來的是我構造ValueError的字符串。在python中找不到stderr打印smtpd

所以,如果我這樣做是process_message:

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

我看到

550, This is the error 

在控制檯上。 我不能爲我的生活找到什麼代碼導致打印。有沒有辦法覆蓋標準錯誤顯示堆棧跟蹤每次打印或以其他方式找到哪些代碼行打印出這些行?

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__避免循環:

+0

你甚至沒有說出它打印出來的東西。所以我沒有任何運氣在我的'/ usr/lib/python2.7/smtpd.py'文件中尋找錯誤信息......但是,如果我在該文件中搜索ValueError,它看起來像你提供了本地和遠程端口的方式,int()不能使用它。使用數字,而不是服務名稱。 – HolgerSchurig

+0

對不起,什麼它打印出是我構建ValueError異常與 所以,如果我做 ValueError異常(「550,這是錯誤」) 我看到 550,這是在控制檯上的錯誤 的字符串。 –

回答

2

你可以用一些痕跡write()調用替換一個標準的輸出流。