MainLoop 예외를 잡아서 메시지를 표시합니다
-
03-07-2019 - |
문제
외부 구성 파일에 의존하는 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 예외가 잡히면. 원하는 예외 만 처리하는 자신의 기능을 설치하고 다른 모든 사람들을 위해 원래 기능을 호출 할 수 있습니다.
아마도 이것 질문은 약간의 사용 일 수 있으며 모든 예외를 포착하려고 시도합니다.
매우 유사한 문제로 저에게 효과가있는 솔루션을 게시합니다.
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 : 어디서나 예외를 포착합니다.