문제

우리가 개발중인 약간의 키트에 대한 작은 디버그 앱을 작성하고 있으며 몇몇 사용자에게 롤아웃하여 충돌을 유발할 수 있는지 확인하고 싶습니다. 누구든지 앱이 충돌시킬 수있는 모든 처리되지 않은 예외를 포착하기 위해 Wxpython 앱을 효과적으로 포장하는 방법을 알고 있습니까?

이상적으로는 모든 출력 (오류가 아니라)을 캡처하여 파일에 로그인하고 싶습니다. 처리되지 않은 예외는 현재 파일에 로그인 한 다음 평소에 따라 예외를 통과하도록 허용해야합니다 (즉, 로깅 프로세스는 투명해야합니다).

나는 누군가가 전에이 라인을 따라 무언가를 했어야한다고 확신하지만, Google을 통해 유용한 것처럼 보이는 것은 없었습니다.

도움이 되었습니까?

해결책

표준 출력을 로깅하려면 다음과 같은 STDOUT 래퍼를 사용할 수 있습니다.

from __future__ import with_statement

class OutWrapper(object):
    def __init__(self, realOutput, logFileName):
        self._realOutput = realOutput
        self._logFileName = logFileName

    def _log(self, text):
        with open(self._logFileName, 'a') as logFile:
            logFile.write(text)

    def write(self, text):
        self._log(text)
        self._realOutput.write(text)

그런 다음 기본 Python 파일 (모든 것을 실행하는 파일)에서 초기화해야합니다.

import sys    
sys.stdout = OutWrapper(sys.stdout, r'c:\temp\log.txt')

예외를 기록하는 것과 관련하여 가장 쉬운 일은 포장하는 것입니다. MainLoop wx.app의 방법으로 시도해 보면 예외 정보를 추출한 다음 어떤 방식으로 저장 한 다음, 예외를 다시 이송합니다. raise, EG :

try:
    app.MainLoop()
except:
    exc_info = sys.exc_info()
    saveExcInfo(exc_info) # this method you have to write yourself
    raise

다른 팁

예외 처리의 경우 로그 파일이 로그로 열렸다고 가정합니다.

import sys
import traceback

def excepthook(type, value, tb):
    message = 'Uncaught exception:\n'
    message += ''.join(traceback.format_exception(type, value, tb))
    log.write(message)

sys.excepthook = excepthook

당신이 사용할 수있는

Sys.ExcepThook

(보다 파이썬 문서)

그리고 몇 가지 사용자 정의 객체를 할당하면 코드에서 일찍 포착되지 않은 모든 예외를 포착 할 수 있습니다. 그런 다음 Traceback과 함께 원하는 파일에 메시지를 로그인하고 예외로 원하는대로 수행 할 수 있습니다 (Reraise, 오류 메시지 표시 및 사용자가 앱을 계속 사용하도록 허용).

STDOUT 로깅에 관해서는, 가장 좋은 방법은 DZINX의 아웃재 파라와 비슷한 것을 쓰는 것이 었습니다.

디버깅 단계에있는 경우 각 항목 후 로그 파일을 플러시하는 것이 좋습니다. 이로 인해 성능이 많이 발생하지만 일부 기본 C 코드에서 segfault를 유발할 수 있다면 로그가 잘못 오도되지 않습니다.

다양한 방법이 있습니다. wxapplication :: oninit에서 Catch 블록을 시도해 볼 수 있습니다. 그러나 항상 GTK에서 작동하는 것은 아닙니다.

좋은 대안은 응용 프로그램을 무시하는 것입니다 :: wxapplication 파생 클래스에서 handleEvent가 다음과 같은 코드를 작성하는 것입니다.

void Application::HandleEvent(wxEvtHandler* handler, wxEventFunction func, wxEvent& event) const
{
    try
    {
        wxAppConsole::HandleEvent(handler, func, event);
    }
    catch (const std::exception& e)
    {
        wxMessageBox(std2wx(e.what()), _("Unhandled Error"),
            wxOK | wxICON_ERROR, wxGetTopLevelParent(wxGetActiveWindow()));
    }
}

C ++ 예이지만 반드시 파이썬으로 쉽게 번역 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top