2

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

4

1 に答える 1

4

Java 5以降を使用している場合は、Thread.setDefaultUncaughtExceptionHandler()を使用することもできます。これは、新しい「Javaスペシャリストのニュースレター」でも説明されています。

http://www.javaspecialists.eu/archive/Issue089.html

そして、これが最新のJava7バージョンです。

http://www.javaspecialists.eu/archive/Issue196.html

これも参照してください: 「sun.awt.exception.handler」プロパティの設定に煩わされるのはなぜですか?

編集:これは私がThread.setDefaultUncaughtExceptionHandlerを使用する方法です(Javaで...):

public static void setupGlobalExceptionHandling() {
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            handleException(e);
        }
    });
}
于 2012-08-17T23:25:39.547 に答える