4

外部構成ファイルに依存する 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 の別のスレッドを生成するためです。

4

5 に答える 5

2

(type, value, traceback)これが wxPython アプリケーションで機能するかどうかはわかりませんが、sys モジュールでは、不明な例外がキャッチされたときに、3 つの引数で呼び出される関数の excepthook 属性を上書きできます。必要な例外のみを処理する独自の関数をそこにインストールし、他のすべての例外に対して元の関数を呼び出すことができます。

参照: http://docs.python.org/library/sys.html#sys.excepthook

于 2009-01-03T16:04:33.753 に答える
1

私はチャンドラーのためにこのようなものをコーディングしました。未処理の例外がスタックやその他の情報を含むウィンドウをポップアップし、ユーザーは追加のコメント(発生したときに何をしたかなど)を入力してチャンドラー開発者に送信できます。必要に応じて、 Mozilla Talkback最近はBreakpadを使用していると思います)機能に少し似ています。

wxPythonでこれを行うには、wx.Appにリダイレクトパラメーターを指定する必要があります。これにより、 wx.PyOnDemandOutputWindowがポップアップ表示されます(見栄えの良い実装を提供するために、オーバーライドすることをお勧めします)。

Chandlerの関連するソースファイルは次のとおりです。

  • Chandler.pyは、アプリケーションを起動してリダイレクト属性を設定し、通常のアプリケーションの起動が失敗した場合にエラーダイアログをキャッチして表示しようとします
  • Application.pyは、カスタマイズされたwx.PyOnDemandOutputWindowの設定を含め、アプリケーションオブジェクトをカスタマイズします
  • Feedback.pyには、カスタマイズされたwx.PyOnDemandOutputWindowの実装があります。さらに、feedback.xrcとfeedback_xrc.pyが必要になります
于 2009-02-05T19:36:01.280 に答える
0

非常によく似た問題で私のために働いた解決策を投稿してください。

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()
于 2012-08-24T12:44:48.130 に答える
0

おそらく、この質問は何らかの役に立つかもしれません。すべての例外をキャプチャしようとします。

于 2009-01-03T18:24:54.767 に答える