16

アプリケーションの1つのスレッドでキャッチされない例外がスローされた場合に呼び出される、Javaアプリケーションで1つのアプリケーションレベルUncaughtExceptionHandlerを定義したいと思います。スレッドのグループ(ThreadGroup)に対してキャッチされない例外を定義することが可能であり、実際にそれを使用していることはわかっていますが、独自のキャッチされない例外ハンドラーを定義していないスレッド、またはデフォルトの例外ハンドラーが定義されているスレッドのグループに関連付けられていません

だから例えば私はこのようなものに到達したい:

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

System.err簡単に言うと、スタックトレースを(デフォルトの動作)に出力する代わりに、デフォルトのUncaughtExceptionHandlerをオーバーライドして、独自のハンドラーを定義したいと思います。

たとえば、C#.NETでは、アプリケーションのMain()メソッドで 未処理スレッド例外イベントハンドラーを処理するのと同様のことを行います。

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

Javaでもできますか?

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

4

2 に答える 2

19

Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler ex)

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

ドキュメントが言うように

キャッチされない例外が原因でスレッドが突然終了し、そのスレッドに他のハンドラーが定義されていない場合に呼び出されるデフォルトのハンドラーを設定します。

また、ThreadGroupでハンドラーを使用することに関する興味深いメモ(ドキュメントにもあります)

デフォルトのキャッチされない例外ハンドラーは、通常、スレッドのThreadGroupオブジェクトに従わないようにする必要があります。これは、無限再帰を引き起こす可能性があるためです。

于 2011-12-02T20:40:34.323 に答える
5

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

于 2011-12-02T20:42:55.793 に答える