外部構成ファイルに依存する wxPython アプリケーションがあります。構成エラーがある場合に表示されるわかりやすいメッセージ ダイアログを提供したいと考えています。app.MainLoop() 呼び出しを try/except ステートメントでラップすることで、これを機能させようとしました。
以下のコードは、私の MainWindow フレーム クラスの init コードに対して機能しますが、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 にはその名前のメソッドがないように見えるため、読んだソースは古くなっている (2004 年) に違いありません。
編集:
メインループ中に未処理の例外をキャッチできるようにする必要があります。これにより、それらをさらに処理してエラー ダイアログに表示し、黙って渡したり、アプリを終了したりできなくなります。
sys.excepthook ソリューションはレベルが低すぎて、wxPython のメインループ スレッドでは適切に機能しません。他の回答へのリンクは同じ try/except を実行しますが、メインループをラップすることは機能しませんが、これは wxPython が app/ui の別のスレッドを生成するためです。