wxPythonが「未処理の例外」ダイアログを表示しないようにする
-
03-07-2019 - |
質問
PythonとwxPythonで記述された複雑なGUIアプリケーションがあります。
Windows Vistaの認定を取得したいので、Windowsエラー報告ダイアログ(" レポートをMicrosoftに送信しますか? ")が表示されます。これは、「 Windows Vistaテストケースの認定」のテストケース32に関連しています。ドキュメント。
残念ながら、 ThreadHijacker
ツールでアプリをクラッシュすると、wxPythonは次のようなメッセージを表示します。
Unhandled exception --------------------------- An unhandled exception occurred. Press "Abort" to terminate the program, "Retry" to exit the program normally and "Ignore" to try to continue. --------------------------- Abort Retry Ignore
wxPythonがこのメッセージを表示しないようにするにはどうすればよいですか?カスタム sys.excepthook
を持っていますが、このダイアログは、exceptフックが干渉する前に表示されるようです。
編集:
wxWidgets docs は、 wxAppConsole :: OnExceptionInMainLoop em>が呼び出され、MSWの下でユーザーがさまざまなオプションから選択できるようにするいくつかの派手なダイアログが表示されます。しかし、wxPythonはその関数のオーバーロードを許可していないようです... wxPythonで wxAppConsole :: OnExceptionInMainLoop のデフォルトの動作を変更する方法を知っている人はいますか?
C / C ++に入るソリューションよりもPythonレベルのソリューションの方が好きです
EDIT2:
全体として、wxPythonメーリングリストで尋ねると、Robin Dunnは、wxPythonの次のリリースで wxAppConsole :: OnExceptionInMainLoop をオーバーライド可能にすることを検討すると答えました。私は待つことができなかったため、その機能を含まない独自のバージョンのwxPythonをコンパイルする必要がありました。 wxAppConsole :: OnExceptionInMainLoop 関数の存在は、コンパイルフラグを適切に設定することで有効/無効にできることが判明しました。
解決
すべてのコンパイルフラグを1つ変更して、自分のwxWidgetsとwxPythonをコンパイルすることになりました。 wxUSE_EXCEPTIONS は0に設定する必要があります。
Robin Dunnは、wxPythonにパッチを適用しようと書いているため、この動作はライブラリ全体を再コンパイルせずに変更できます。
他のヒント
正しく覚えていれば、これはwxWidgetsのトップレベル(wxApp)のcatch(...)です。ベクトル化された例外ハンドラーまたは_set_se_translator()を使用して、構造化例外で最初のショットを取得し、そこからWERに終了できます。つまり、そこからReportFault()を実行できます。
すべてを処理することは可能ですか?ウィジェットにバインドされたすべてのメソッドの周りに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が独自のキャッチを行う場所だと想定しているため)。