2009-07-27 8 views
3

파이썬 (2.6)에서 예외 처리 코드에서 어딘가에 스택이 호출되는지 확인할 수있는 함수를 작성하고 싶습니다.파이썬에서 예외 처리 코드에 의해 호출되고 있는지 확인하는 방법은 무엇입니까?

특수 로깅 용도로 사용됩니다. 파이썬의 logging 모듈에서 호출자는 예외 정보가 기록되도록 명시 적으로 지정해야합니다 (logger.exception()을 호출하거나 exc_info 키워드를 사용하여). 내 로거가 예외 처리 코드 내에서 호출되는지 여부에 따라이 작업을 자동으로 수행하고 싶습니다.

나는 sys.exc_info()를 검사하는 것이 대답 일 것이라고 생각했지만 이미 처리 된 예외로부터 예외 정보를 반환한다고 생각했습니다. (docs에서 : "이 함수는 현재 처리되고있는 예외에 대한 정보를 제공하는 세 개의 값의 튜플을 반환합니다 ... 현재 스택 프레임이 예외를 처리하지 않으면 정보가 호출 스택 프레임에서 가져옵니다. 호출자 등 스택 프레임이 발견 될 때까지 예외를 처리한다. 이때, '실행 또는 이 절 제외 실행 한. ")

또한 정의된다"예외 처리 ", 이후이 호출자에게 투명하기를 원하기 때문에 except 절에 exc_clear() 또는 다른 것을 사용하고 싶지 않습니다.

어떻게해야할까요?

+0

어떻게 호출 컨텍스트가 모호 할 수 있습니까? 예외 **에서 호출 될 함수 **를 정의합니다. 항상 예외에서 호출됩니다. 뭐가 문제 야? 예외에서 호출되도록 고안된 함수가 예외에서 호출되지 않는 이유를 설명해주십시오. –

+0

예외로 호출 할 함수로 이것을 정의하지 않았습니다. 이것은 예외에서 호출되거나 비 예외에서 호출 될 수있는 함수입니다. 나는 어떤 경우인지 결정하고 싶다. –

+1

Ummm ... 함수를 정의하는 것이 잘못되어 ** 예외에서 호출해야합니다 **? 이것을 단순화하기 위해 함수 정의를 변경하지 못하게하는 요인은 무엇입니까? –

답변

2

예외 핸들러에서 sys.exc_clear을 사용하여 예외를 지우면 sys.exc_info이 작동합니다. 다음 스크립트를 실행하는 경우 : 예를 들어

import sys 

try: 
    1/0 
except: 
    print sys.exc_info() 
    sys.exc_clear() 
print sys.exc_info() 

는이 결과가 나타납니다 :

 
(, ZeroDivisionError('integer division or modulo by zero',),) 
(None, None, None) 

업데이트 : 간단한 ("투명") 방법이 생각하지 않습니다 "예외 핸들러가 실행 중입니까?" 어떤 문제에 빠지지 않고, 제 의견으로는 로깅을 위해서만 문제를 해결할 가치가 없습니다. 스택 프레임 단위로도 "예외가 제기 되었습니까?"라는 질문에 쉽게 대답 할 수 있습니다 (프레임 객체에 대한 설명서 참조).

+0

감사합니다 Vinay,하지만 호출자에게 투명하게 수행 할 수있는 방법을 찾고 있습니다. 즉, except 절에서 특별한 것이 필요하지 않습니다. 더 구체적으로 질문을 편집하겠습니다. –

0

파이썬의 모든 것과 마찬가지로 예외는 객체입니다. 따라서 처리 된 마지막 예외에 대한 약한 참조를 유지하고 sys.exc_info()을 사용할 수 있습니다. 참고 : 멀티 스레딩 코드의 경우이 방법에 문제가있을 수 있습니다. 그리고 다른 코너 케이스도있을 수 있습니다.

그러나, explicit is better than implicit; 정말로 정상적인 것과 같은 방식으로 예외 로깅을 처리하는 것이 시스템에 추가하는 좋은 기능인 것은 확실합니까?
저의 겸허 한 의견으로는 아닙니다.

관련 문제