web-dev-qa-db-ja.com

Java:グローバル例外ハンドラー

Javaでグローバル例外ハンドラを作成する方法はありますか?私はこのように使いたいです:

"When an exception is thrown somewhere in the WHOLE program, exit."

ハンドラは、try-catch本体でスローされた例外をキャッチしない場合があります。

マルティン

40

Thread.setDefaultUncaughtExceptionHandler を使用します。例については、Rod Hiltonの " Global Exception Handling "ブログ投稿を参照してください。

58
bobbymcr

デフォルトのUncaughtExceptionHandler を設定できます。これは、例外がシステム全体でキャッチされない場合に使用されます。

4
Kolibri

Logback を使用してキャッチされなかった例外を処理する例を次に示します。

_Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    public void uncaughtException(Thread t, Throwable e) {
        LoggerFactory.getLogger("CustomLogger").error("Uncaught Exception in thread '" + t.getName() + "'", e);
        System.exit(1);
    }
});
_

これは Thread.setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler) を使用してスレッドごとに行うこともできます

3
Brad Mace

明確にするために、スタンドアロンのJavaアプリケーションまたはスレッドの明確に定義されたエントリポイントがあることが確実なインスタンスの場合は、setDefaultUncaughtExceptionHandlerを使用します。

スレッドの明確に定義されたエントリポイントがない場合、たとえば、セットアップとティアダウンがコードの外部で処理されるWebサーバーまたはアプリサーバーコンテキストまたはその他のフレームワークで実行している場合は、そのフレームワークがグローバル例外を処理する方法。通常、これらのフレームワークには、定義するのではなく、参加者になる独自の確立されたグローバル例外ハンドラーがあります。

より詳細な議論については、 http://metatations.com/2011/11/20/global-exception-handling-in-Java/ を参照してください。

2
Clifford Oravec

DefaultUncaughtExceptionHandlerが正解です。数日前に Jeff Storeythis の場所で私に明らかにされました。疑わしいように、「手動で」キャッチされた例外は、このハンドラーによってキャッチされることはありません。しかし、私は次の警告を受けました:

**-J2EEに準拠するために、Webアプリケーションはスレッドを使用しないでください。**

プロジェクトを適切な方法でチェックし、推奨されるJavaコーディングスタイル [〜#〜] pmd [〜#〜] プラグイン Eclipse IDE。

0
hypercube

Threads.setDefaultUncaughtExceptionHandler()は機能しますが、すべての場合では機能しません。たとえば、Swingウィジェットを作成する前にmain()で使用しており、AWTイベントスレッドやSwingWorkerスレッドなど、Swingによって作成されたスレッドで機能します。

悲しいことに、JavaSE 1.6を使用してLDAP URLを使用する場合、javax.naming.spi.NamingManager.getInitialContext()によって作成されたスレッドには影響しません。間違いなく他の例外があります。

0
Jeff Learman