2014-06-08 6 views
4

파이썬에서 커스텀 트레이스 백을 생성 할 수 있습니까? 파이썬 3의 raise ... from ...을 모방 한 함수 raise_from()을 작성하려고합니다.수동으로 파이썬 트레이스 백 생성

def raise_from(exc, cause): 
    """ Raises the Exception *exc* from the calling stack-frame, 
    settings its ``__cause__`` to *cause*. """ 

    exc.__cause__ = cause 

    try: raise Exception 
    except Exception: 
     tb = sys.exc_info()[2] 

    # Remove the last traceback entry. 
    prelast_tb = tb 
    while prelast_tb.tb_next: 
     prelast_tb = prelast_tb.tb_next 
    prelast_tb.tb_next = None 

    raise type(exc), exc, tb 

불행히도 traceback 인스턴스의 속성은 읽기 전용입니다.

답변

1

예외의 원래 개체 인스턴스를 수정하는 대신 추적 대상 개체의 형식 함수를 사용하여 list와 같은 더 간단한 형식으로 간단히 변환 할 수 있습니다. 그리고 트레이스 목록을 커스터마이징 한 후 원래의 것과 같은 인쇄 가능한 문자열로 다시 변환하십시오 :
그래서, 원하는 파일 (예 : stdout 등)에 커스터마이징 된 버전을 인쇄하고 싶을 것입니다.

tb_list = traceback.extract_tb(tb) 
tb_list = tb_list[:-1] #omitting the last trace-back entry 
tb_str = tb.format_list(tb_list) 
# print whatever 

역 추적 개체의 원래 특성을 덮어 쓰려면 슬롯을 사용자 지정하거나 클래스의 @property 필드를 재정 의하여 TraceBack 개체를 재정의해야합니다.

+0

추적 표시를 출력하고 싶지 않습니다. 특정 추적을 사용하여 예외를 발생시키고 싶습니다. 그 예외는 여전히 붙잡혀 인쇄되지 않을 수 있습니다. –

관련 문제