ここで説明されているように、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 を使用しています)