2

저는 PyQt4 사용자 인터페이스를 사용하고 있습니다. 쉬운 디버깅 및 문제 해결을 위해 stderr을 로그 파일로 리디렉션했지만 오류가 발생하면 사용자에게 오류 메시지를 표시해야합니다.사용자에게 로깅하면서 오류를 표시하는 방법은 무엇입니까?

제 문제는 예외가 발생했을 때 예외를 잡아서 사용자에게 발생했음을 알리는 것이지만 여전히 추적 기록을 표준 오류 (예 : 로그 파일)로 전달하도록해야한다는 것입니다.

나는 이런 식으로 뭔가 할 경우이 예외를 catch하고 오류 로그에 전달 될 수 없습니다

def updateResults(self): 
    try: 
     #code that updates the results 
    except: 
     #display error message box 

합니다.

사용자에게 메시지를 표시하고 오류를 전파하는 방법이 있습니까?

이 방법이 유용할까요?

except, e: 
    #display error message box 
    raise e 

내 목표를 달성하는 더 좋은 방법이 있습니까?

답변

6

나는 이것에 대해 잘못된 생각을하고 있다고 생각합니다. 오류를 다시 일으켜서 줄 아래로 더 이상 기록하지 말아야합니다. 파이썬에서이를 수행하는 일반적인 방법은 로깅 모듈을 사용하는 것입니다. 워드 프로세서에서 적응 :

import logging 
LOG_FILENAME = '/tmp/logging_example.out' 
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG,) 

... 

try: 
    # code 
except: 
    logging.debug('Something bad happened', exc_info=True) 
    # display message box 
    # raise (if necessary) 

이것은 sys.stdout에 생산 된 오류에 의존하는 것보다 훨씬 더 유연한 로깅 시스템을 제공합니다. 예외로부터 복구 할 수있는 경우 예외를 다시 제기하지 않아도됩니다.

+0

나는이 방법을 미래의 프로젝트에 확실히 사용할 것입니다. 지금 py2exe는'stderr'의 리다이렉트를하고 있습니다. 그래서 모든 코드를 try-except 블록으로 리팩터링하지 않으면 두 개의 로그 파일 (잡히거나 잡히지 않은 예외)이 생깁니다. – tgray

+0

기본적으로이 방법을 구현하면 * this * 프로젝트의 리팩토링 시간에 가치가 있지 않습니다. – tgray

+0

잡힌/잡히지 않은 예외를 분리하고 싶습니다 (tgray). Ant에 대해 설명하는 로깅 스키마가 가장 좋습니다. 파일에 로깅하거나 데이터베이스에 로깅하거나 심지어 파일 및 데이터베이스에 로깅 할 수 있으며 모든 위치에서 코드를 변경할 필요가 없기 때문입니다. – DevinB

3

정확히,하지만 당신은 할 수 있습니다 만

현재 처리 된 예외를 다시 올릴 것이다
raise 

.

1

몇 가지 추가 정보 : 당신은 모든 캐치되지 않는 예외를 잡기 위해 자신의 기능에 sys.excepthook를 리 바인드해야합니다 (PyQt4와)

. 그렇지 않으면 PyQt는 단지 콘솔에 출력 할 것이고 이것은 당신이 필요로하지 않을 수도 있습니다 ...

import sys 

def excepthook(exc_type, exc_val, tracebackobj): 
    # do something useful with the uncaught exception 
    ... 

def main(): 
    # rebind excepthook 
    sys.excepthook = excepthook 
    ... 
+0

사실, py2exe가 자동으로 "program.exe.log"파일을 만듭니다. – tgray

+0

그러나 py2exe와 번들되지 않은 응용 프로그램을 작성했는지 확인하는 것이 좋습니다. – tgray

관련 문제