문제

외부 구성 파일에 의존하는 wxpython 응용 프로그램이 있습니다. 구성 오류가있는 경우 표시되는 친숙한 메시지 대화 상자를 제공하고 싶습니다. 나는 app.mainloop () call에서 try/portect 문에서 전화를 걸어이 작업을 만들려고 노력했다.

아래 코드는 MainWindow 프레임 클래스의 Init Code에 대해 작동하지만 MainLoop 내에서 발생하는 예외를 포착하지 않습니다. 이러한 예외도 어떻게 잡을 수 있습니까?

if __name__ == '__main__':
    app = MyApp(0)
    try:
        MainWindow(None, -1, 'My Cool App')
        app.MainLoop()
    except ConfigParser.Error, error_message:
        messagebox = wx.MessageDialog(None, error_message, 'Configuration Error', wx.OK | wx.ICON_ERROR)
        messagebox.ShowModal()

WX.App 클래스에서 무시할 수있는 OneXceptionInMainLoop 메소드에 대한 언급을 읽었지만 WX.App은 더 이상 해당 이름의 메소드가없는 것 같습니다.

편집하다:

메인 루프 중에 처리되지 않은 예외를 잡을 수 있어야하므로 더 자세히 처리하고 조용히 통과하지 않고 앱을 종료하지 않고 오류 대화 상자에 표시 할 수 있어야합니다.

Sys.ExcepThook 솔루션은 너무 낮은 수준이며 WXPYTHON MainLoop 스레드에서는 잘 작동하지 않습니다. 다른 답변에 대한 링크는 다시 한 번 작동하지 않는 메인 루프 주위를 앱/ui에 대한 다른 스레드를 산란하는 것을 제외하고는 동일한 시도/를 제외하고는 동일한 시도/를 수행합니다.

도움이 되었습니까?

해결책

나는 이런 것을 코딩했다 챈들러, 처리되지 않은 예외가 스택 및 기타 정보와 함께 창을 튀어 나오는 경우, 사용자는 추가 의견을 내고 (발생했을 때 무엇을했는지 등) 챈들러 개발자를 위해 제출할 수 있습니다. 조금 비슷합니다 모질라 토크백 (요즘에는 그들은 내가 믿는 브레이크 패드를 사용합니다) 당신이 원한다면 기능을 사용합니다.

WXPYTHON에서이를 위해서는 WX.App에 리디렉션 매개 변수를 제공해야합니다. 이것은 나타날 것입니다 wx.pyondemandoutputwindow (아마도 더 멋진 구현을 제공하기 위해 그것을 무시하고 싶을 것입니다).

챈들러의 관련 소스 파일은 다음과 같습니다.

  • 챈들러 응용 프로그램을 시작하고 리디렉션 속성을 설정하고 일반 애플리케이션 시작이 실패한 경우 오류 대화 상자를 잡고 표시하려고합니다.
  • application.py 사용자 정의 된 wx.pyondemandoutputwindow 설정을 포함하여 응용 프로그램 객체를 사용자 정의합니다.
  • 피드백 .py 맞춤형 wx.pyondemandoutputwindow에 대한 구현이 있습니다. 추가로 피드백이 필요합니다 .xrc 및 feedback_xrc.py

다른 팁

이것이 WXPyThon 응용 프로그램에 대해 작동하는지 모르겠지만 SYS 모듈에서는 3 인수로 호출 된 함수 인 ExcepThook 속성을 덮어 쓸 수 있습니다. (type, value, traceback), uncaugth 예외가 잡히면. 원하는 예외 만 처리하는 자신의 기능을 설치하고 다른 모든 사람들을 위해 원래 기능을 호출 할 수 있습니다.

찾다: http://docs.python.org/library/sys.html#sys.excepthook

아마도 이것 질문은 약간의 사용 일 수 있으며 모든 예외를 포착하려고 시도합니다.

매우 유사한 문제로 저에게 효과가있는 솔루션을 게시합니다.

import wx
import sys
import traceback

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        panel = wx.Panel(self)
        m_close = wx.Button(panel, -1, "Error")
        m_close.Bind(wx.EVT_BUTTON, self.OnErr)
    def OnErr(self, event):
        1/0

def handleGUIException(exc_type, exc_value, exc_traceback):
    err_msg = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
    err_msg += '\n Your App will now terminate'
    # Here collecting traceback and some log files to be sent for debugging.
    # But also possible to handle the error and continue working.
    dlg = wx.MessageDialog(None, err_msg, 'Termination dialog', wx.OK | wx.ICON_ERROR)
    dlg.ShowModal()
    dlg.Destroy()
    sys.exit()

sys.excepthook = handleGUIException

if __name__ == '__main__':
    app = wx.App(redirect=False) 
    top = Frame()
    top.Show()
    app.MainLoop()

사용 sys.excepthook 나에게는 매우 괜찮습니다.

다음과 같은 큰 도움이 있습니다. WXPYTHON : 어디서나 예외를 포착합니다.

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