ここで説明されているように、swing アプリケーションの一般的な例外ハンドラーを構築しようとしています: http://www.javaspecialists.eu/archive/Issue081.html
私はjthonで作業しています(Python構文がJavaにコンパイルされて実行されます)。私のコードはおおよそ次のようになります(更新済み):
def launcher(func):
class launcherThread(Runnable):
def __init__(self):
super(launcherThread, self).__init__()
def run(self):
func()
#trying to get the name which can be used to instantiate this in java
cls = ExceptionGroup().getClass()
fullName = cls.__module__ + '.' + cls.__name__
System.setProperty("sun.awt.exception.handler", fullName)
Thread(ExceptionGroup(), launcherThread(), 'Cross ExceptionHandlerThread').start()
class ExceptionGroup(ThreadGroup):
def __init__(self):
super(ExceptionGroup, self).__init__("HardenedGroup")
def uncaughtException(self, thread, exception):
#make a fancy dialog displaying str(exception)
テストすると問題なく動作しますが、本番環境では失敗します。テストのために、Eclipse (PyDev) でプログラムを起動します。本番環境は、Jython コンソールが組み込まれている Java で記述されたサード パーティ アプリケーションです。アプリケーションは、カスタム メニュー エントリの追加と、これらへの jython スクリプトの配置をサポートしています。
テスト環境と本番環境の主な違いは、本番環境ではスイング スレッドがすでに開始されていることです (サード パーティのアプリケーションはスイングを利用します)。これによりThreadGroup設定が失敗しますか、それとも機能しない別の理由がありますか?
関連するスレッド (buttonActions の結果として例外がスローされる) を取得して、defaultException ハンドラをチェックするにはどうすればよいですか? (恐れ入りますが) サード パーティが独自のハンドラーをインストールしたことが判明した場合 (すべての例外はログ ファイルに書き込まれます)、新しい Swing ワーカー スレッドを作成するにはどうすればよいですか? (やっぱりホストアプリが作った例外はキャッチしたくない)
func質問の要約: 1. 関数に渡された 関数に対して開始されたスレッドを確認し、キャッチされていlauncherない例外ハンドラーを確認するにはどうすればよいですか? 2. 自分の GUI 部分とメイン アプリケーションの GUI 部分に個別の Swing ディスパッチャーを適用できますか? (アドインのフレームで exitOnClos を終了すると、サード パーティ アプリケーションが閉じます)?
更新:lbalazscs私はsun.awt.exception.handlerプロパティを使用しようとしていますが、それは効果がなく、例外はログファイルに残ります(アプリケーションのデフォルト動作)。私はそれを正しく使用していますか?(ps: 私は Java 1.6 を使用しています)