2013-07-23 3 views
0

smtpd와 catch하는 ValueError 예외를 사용하여 process_message에서 발생시키고 오류를 발생시키는 대신 stderr에 설명을 인쇄합니다. 그것이 출력하는 것은 ValueError를 구성하는 문자열입니다. 내가 process_message에서이 작업을 수행하는 경우python smtpd stderr 인쇄를 찾을 수 없습니다.

그래서 :

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

을 나는 콘솔에

550, This is the error 

를 참조하십시오. 인쇄물의 원인이되는 코드를 찾지 못했습니다. 여하튼 뭔가가 인쇄 될 때마다 stacktrace를 보여주기 위해 stderr를 오버라이드 할 수 있습니까? 그렇지 않으면이 줄을 인쇄하는 코드 행을 찾으십시오. 내가 루프를 방지하기 위해 __stderr__을 사용하고

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() 

참고 :

+0

당신은 * 인쇄 된 것이 무엇인지 * 말하지 않았습니다. 그래서 나는'/ usr/lib/python2.7/smtpd.py' 파일에서 에러 메시지를 찾지 못했다. 그러나 그 파일에서 ValueError를 검색하면, 로컬 및 원격 포트 int() 작동하지 않는 방식으로. 서비스 이름이 아닌 번호를 사용하십시오. – HolgerSchurig

+0

죄송합니다, 그것은 무엇 출력합니다 것은 내가 ValueError를 ("550은,이 오류입니다") 내가 (550)를 참조 을 할 그렇다면,이 콘솔에 오류 입니다 으로 ValueError를을 구성 문자열입니다. –

답변

2

당신은 write()의 호출을 추적 뭔가 하나 개의 표준 출력 스트림을 교체 할 수 있습니다.