Hatena::ブログ(Diary)

おいしい大麻味噌の熟成日記

Ruby,Linux,Mac OS Xについて主にプログラミングをしています。この日記の中で触れられている、私の作成したプログラムやパッチはこちらからダウンロードできます...

2009-01-23

[] AWT/Swing でエラーダイアログを表示する。(Sunの実装限定)

後でこのプロパティ名で検索したら、sun.awt.exception.handler - ある学生さんのシステム開発日記に書かれていた。

うぐぐ、 "awt 例外 キャッチ" とか "awt 例外 ダイアログ" とかで検索して見つからなかったから、諦めて調べたが…。 "awt 例外 ハンドラ" と検索すればよかったのか。(2番目に出てくる)

良い検索キーワードが閃けば、時間を節約できるなあ…。

AWT/Swingのイベントハンドラで例外が発生すると、ユーザにはそんなことは何も分からずに、ただスタックトレースが吐き出されるだけである。

これを自動的に例外が発生したら、エラーダイアログを出すなり何なりの処理をさせたいと思った。

しかし、例えば addExceptionHandler() とか、そのような目的のためのAPIは無いようだ。

"sun.awt.exception.handler" に例外処理クラスを設定

AWTの例外処理ソースを追っていくと、

  • EventDispatchThread.pumpOneEventForHierarchy で例外が catch される。
  • EventDispatchThread.processException
  • EventDispatchThread.handleException

という流れで例外が処理されている。この handleException の中のソースを見て、どうすればよいかが分かった。

次の例外処理クラスを作って、

public class AWTExceptionHandler {
	public static void setup() {
		System.setProperty("sun.awt.exception.handler", AWTExceptionHandler.class.getName());
	}
	public void handle(Throwable ex) {
		// エラー処理を書いてくれぃっ!
		ex.printStacktrace();
	}
}

アプリケーションの初期化処理の中で、

AWTExceptionHandler.setup();

を呼べばよい。

これにより、イベントハンドラで発生した例外すべてを、 handle() の中で処理できる。

もちろんこの中で、ダイアログ表示も可能。

たぶんSunの実装限定と思われるが、Mac ( Apple製JVM )でも動作したので、大方問題無いだろうと思う。

ThreadGroup.uncaughtException を使う方法

ちなみに、

catch を書かなくても例外発生時にエラーメッセージを出したい - Java Solution

ThreadGroup.uncaughtException を使う方法もあるようだ。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証