1

Python と wxPython で記述された複雑な GUI アプリケーションがあります。

Windows Vista で認定されるようにしたいので、Windows エラー報告ダイアログ (「レポートを Microsoft に送信しますか?」というダイアログ) が表示されるような方法でクラッシュする必要があります。これは、「 Certified for Windows Vista Test Cases」ドキュメントのテストケース No 32 に関連しています。

残念ながら、ThreadHijackerツール wxPython でアプリをクラッシュさせると、次のようなメッセージが表示されます。

未処理の例外
---------------------------
未処理の例外が発生しました。「中止」を押してプログラムを終了し、
プログラムを正常に終了するには「再試行」し、続行するには「無視」します。
---------------------------
中止 再試行 無視

wxPython がこのメッセージを表示しないようにするにはどうすればよいですか? 私は custom を持っていますsys.excepthookが、私の except フックが干渉する前にこのダイアログが表示されるようです。

編集:

wxWidgets docsによると、wxAppConsole::OnExceptionInMainLoopが呼び出され、MSW の下で、ユーザーがさまざまなオプションを選択できるようにするいくつかの派手なダイアログが表示されます。ただし、wxPython ではその関数のオーバーロードが許可されていないようです... wxPython でwxAppConsole::OnExceptionInMainLoopのデフォルトの動作を変更する方法を知っている人はいますか?
C/C++ に移行するソリューションよりも、Python レベルのソリューションを好みます

EDIT2:

全体として、wxPython メーリング リストで質問したところ、Robin Dunn は、wxPython の次のリリースでwxAppConsole::OnExceptionInMainLoop をオーバーライド可能にすることを検討すると答えました。待ちきれなかったので、その関数を含まない独自のバージョンの wxPython をコンパイルする必要がありました。wxAppConsole::OnExceptionInMainLoop関数の存在は、コンパイル フラグを適切に設定することで有効/無効にできることが判明しました 。

4

4 に答える 4

2

最終的には、 wxUSE_EXCEPTIONSを 0 に設定する必要があるコンパイル フラグを 1 つだけ変更して、独自の wxWidgets と wxPython をコンパイルすることになりました。

Robin Dunn は、wxPython にパッチを当てようとしているので、ライブラリ全体を再コンパイルしなくてもこの動作を変更できると書いています。

于 2010-03-29T10:53:30.543 に答える
1

すべてを処理することは可能ですか?おそらく、ウィジェットにバインドされたすべてのメソッドの周りに try:except: ブロックを配置する必要があります。デコレータを書くことができます:

def catch_exception(f):
    def safe(*args, **kw):
        try:
            f(*args, **kw)
        except Exception, e:
            handle_exception(e)
    return safe

def handle_exception(e):
    # do Vista stuff
    sys.exit()

次に、メインループによって呼び出される可能性のある関数を装飾します (wxPython が独自のキャッチを行う場所であると推測しているため)。

于 2009-03-09T00:48:15.620 に答える
1

私の記憶が正しければ、これは wxWidgets の最上位 (wxApp) にある catch(...) です。ベクトル化された例外ハンドラーまたは _set_se_translator() を使用して、構造化された例外で最初のショットを取得し、そこから ReportFault() などの WER に終了できます。

于 2009-03-06T11:19:15.550 に答える
0

http://wiki.python.org/moin/CrashingPythonを試してください

于 2009-03-06T11:11:12.790 に答える