2012-01-10 1 views
4

저는 Twister를 사용하여 서버를 구축하고 있습니다. 또한 서버 오류 로그를 유지 관리하고 있습니다. 문제는 스택에서 모든 예외를 실행하도록하면 현재 연결이 끊어지고 사용자 연결이 끊어 지므로 분명히 다른 모든 것을 잡기 위해 맨손으로 연결된다는 것입니다.예외를 다시 일으키지 않고 예외에서 추적 가져 오기

일단 내가 잡은 적이 있다면, 트레이스 백을 문자열로 가져 와서 어딘가에 저장할 수있는 방법이 있습니까/직접 올려서 인쇄하지 않고 프로그램이 충돌하면 Python에서 인쇄하도록 할 수 있습니까?

답변

2

-하지만 중요한 것은이 때문이다 역 추적 정보 자체는 모듈 sys의 "interpreter global"변수 - sys.exc_traceback에 저장됩니다. 인용

: 절의 실내 제외하고 이전

http://docs.python.org/reference/compound_stmts.html#try

가 예외에 대한 정보는 SYS 모듈 세 개의 변수에 할당되어 실행된다 : sys.exc_type 개체가 식별 받는다 예외; sys.exc_value는 예외의 매개 변수를받습니다. sys.exc_traceback을 는

당신은 절을 제외하고 내 stdout에 인쇄 된 역 추적을 가지고 traceback.print_tb하는 매개 변수로 sys.exc_traceback을 개체를 전달할 수 있습니다 ... 역 추적 객체를받습니다.

+0

이것은 정말 고마워요. – xanderflood

0

그래, 거기에는 module이 있습니다. traceback 모듈에는 예외 정보를 인쇄하거나 서식을 지정하거나 원시 스택 프레임을 반환하여 원하는대로 할 수있는 기능이 있습니다.

그러나 비교적 정교한 응용 프로그램의 경우 일반 올드 traceback 기능 대신 로깅 시스템을 사용하는 것이 좋습니다. 특히 logging.Logger.exception 메서드는 사용자 (또는 사용자의 소프트웨어 사용자)가 구성한 로깅 대상에 대한 예외 정보를 작성합니다. 기본 포맷터는 파이썬이 콘솔에 있기 때문에 트레이스 백을 출력하지만, Formatter을 생성하고 format_exception 메소드를 오버라이드하여 로그에서 예외 표시를 사용자 정의 할 수 있습니다. 재정의 된 메서드는 예외 출력의 형식을 지정해야하는 경우 traceback 함수를 호출 할 수있는 곳입니다.

1

, 당신이 파일에 log the traceback 수있는 logging module 사용 : 추적 모듈은 인쇄 및 역 추적 (exameble를 들어, traceback.print_tb를) 검사에 대한 몇 가지 도우미 함수가 포함

import logging 
logging.basicConfig(level = logging.DEBUG, filename = logfile) 
logger = logging.getLogger(__name__) 
try: 
    1/0 
except ZeroDivisionError as err: 
    logger.exception(err) 
1

이 시도 : 트릭을 할 전체 스택을 인쇄해야

import traceback, sys 

try: 
    # Do something that might raise an exception 
    open("/does not exist",'rb') 
except: 
    traceback.print_exc(file=sys.stderr) 
    # Or 
    traceback.print_exc(file=your_open_log_file) 

도 추적합니다.

관련 문제