2011-12-02 3 views
10

1つのアプリケーションレベルを定義したいUncaughtExceptionHandler Javaアプリケーションで、キャッチされない例外がアプリケーションの1つのスレッドでスローされた場合に呼び出されます。 スレッドグループ(ThreadGroup)に対してキャッチされていない例外を定義することは可能で、実際には使用していますが、独自のキャッチされていない例外ハンドラを定義していないスレッドと定義されているデフォルト例外ハンドラを持つスレッドのグループには関連付けられていません。私はデフォルトたuncaughtExceptionHandlerをオーバーライドし、それがデフォルトです(System.errに代わり、プリントのスタックトレースを私自身のハンドラを定義する簡単な言葉ではアプリケーションのすべてのスレッドに対して1つのグローバルUncaughtExceptionHandlerを定義します。

1° LEVEL ---> Call thread own UncaughtExceptionHandler ---> 2° LEVEL Call Thread Group UncaughtExceptionHandler ---> 3° LEVEL Call application(default) UncaughtExceptionHandler 

だから例えば私はこのような何かに到達したいです動作)。例えば

C#.NETで、私は、アプリケーションのmain()メソッドで未処理スレッド例外イベントハンドラを扱う似たような操作を行います。

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 

でもJavaで行うことができますか?

JavaでデフォルトのUncaughtExceptionHandlerをオーバーライドするにはどうすればよいですか?

答えて

16

Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex)

これは、あなたが探しているものを達成すべきです。

ドキュメントは

は、デフォルトのハンドラを設定して言うように、スレッドが突然キャッチされない例外のために終了し、他のハンドラがそのスレッドのために定義されていないときに呼び出されます。デフォルトのキャッチされない例外ハンドラは通常 がそのように、スレッドのThreadGroupオブジェクトに延期するべきではないとのThreadGroup

でハンドラを使用して、あなたに関する

や興味深いノート(もドキュメントでは)注無限の 再帰を引き起こす可能性があります。

+0

これはアプリケーションのすべてのスレッドに対して有効ですか、またはこれが定義されている現在のスレッドに対してのみ有効ですか?アプリケーションのメインメソッドで定義する必要がありますか? – aleroot

+1

スレッドクラスの静的フィールドとして設定され、スレッドローカルフィールドとしては設定されません。したがって、アプリケーション内のすべてのスレッドで有効です。これはmainメソッドで定義することができますが、mainクラスの 'static'ブロック内に定義したいと思うかもしれません。 –

+0

@JohnVint上記のコメントで答えを更新してください。私にとっては、あなたがThreadクラスの静的フィールドであると言ったときは理解しやすい – Gerrard

4

デフォルトのキャッチされない例外ハンドラを設定する必要があります。これはThreadクラスのstaticメソッドで、setDefaultUncaughtExceptionHandlerと呼ばれます。これを実行すると、実行中のアプリケーションの例外ハンドラを設定します。別途指定されていない限り、新しいスレッドのデフォルトになります。

関連する問題