2011-02-07 4 views
2

나는 여러 곳에서 log.error()와 log.exception()을 호출하는 파이썬 스크립트를 가지고있다. 이러한 예외가 잡히면 스크립트를 계속 실행할 수 있지만 오류 코드가있는 스크립트를 종료 할 수 있도록 log.error() 및/또는 log.exception()이 호출되었는지 여부를 확인하고 싶습니다. sys.exit (1) 호출하여. 아래에 "error"변수를 사용한 순진한 구현이 포함되어 있습니다. 더 나은 방법이 있어야합니다.파이썬 프로그램을 실행하는 동안 오류가 기록되었는지 어떻게 알 수 있습니까?

error = False 

try: 
    ... 
except: 
    log.exception("Something bad occurred.") 
    error = True 

if error: 
    sys.exit(1) 
+1

당신은 그 좋은 생각 확인 : 아래

내가 사용하는 코드입니다? 예외를 발생시킬 수있는 많은 이유가 있으며, 그 중 최소한의 이유는 오류 코드로 종료해야하는 이유입니다. 또한 [except :는 보통 악의입니다] (http://docs.python.org/howto/doanddont.html#except). 중요한 오류 인 경우 오류 메시지를 인쇄하고 *가 발생하면 종료하십시오. – delnan

답변

2

나는 귀하의 솔루션이 최선의 선택이라고 생각하지 않습니다. 로깅은 스크립트의 한 측면이며 제어 흐름에 따라 오류 코드를 반환하는 것은 다른 것입니다. 아마 예외를 사용하는 것이 더 나은 선택이 될 것입니다.

그러나 로그 할 호출을 추적하려는 경우 데코레이터로 래핑 할 수 있습니다. 데코레이터의 간단한 예가 다음과 같습니다 (상속 또는 동적 속성 액세스없이).

class LogWrapper: 

    def __init__(self, log): 
     self.log = log 
     self.error = False 

    def exception(self, message) 
     self.error = True 
     self.log.exception(message) 
0

카운터를 사용할 수 있습니다. 개별 예외를 추적하려면 예외를 키로, 정수 카운터를 값으로 사용하여 사전을 작성하십시오.

1

원본 포스터와 동일한 문제가 있습니다. 오류 또는 더 큰 심각도의 메시지가 기록 된 경우 오류 코드가있는 Python 스크립트를 종료하고 싶습니다. 내 응용 프로그램에서는 처리되지 않은 예외가 발생하지 않는 한 실행을 계속하는 것이 바람직합니다. 그러나 오류가 기록 된 경우 지속적인 통합 빌드가 실패합니다.

나는 우리가 필요로하는 errorhandler 파이썬 패키지를 발견했습니다. GitHub, PyPI pagedocs을 참조하십시오.

import logging 
import sys 

import errorhandler 

# Track if message gets logged with severity of error or greater 
error_handler = errorhandler.ErrorHandler() 

# Also log to stderr 
stream_handler = logging.StreamHandler(stream=sys.stderr) 
logger = logging.getLogger() 
logger.setLevel(logging.INFO) # Set whatever logging level for stderr 
logger.addHandler(stream_handler) 

# Do your program here 

if error_handler.fired: 
    logger.critical('Failure: exiting with code 1 due to logged errors') 
    raise SystemExit(1) 
관련 문제