3

Webアプリケーションでの例外の処理について質問があります。スーパークラスの例外をキャッチするのは悪い考えだとよく耳にします。

strutsアクション/javaサーブレットクラスのすべての例外をキャッチするコードを書くことがよくあります。

try {
     // call business facade
     // business facade calls DAO
     // any exception from DAO bubbles up 
} catch (Exception e) {
  log.error("error", e);
}

スーパークラスの例外をキャッチしない場合。予期しないランタイムエラーを処理し、適切にログに記録するにはどうすればよいですか

4

4 に答える 4

6

キャッチされない例外を処理するようにプロジェクトのを設定DefaultUncaughtExceptionHandlerできます。たとえば、これは私のプロジェクトの1つにあるコードの一部です。

private static void setDefaultUncaughtExceptionHandler() {
    try {
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

            @Override
            public void uncaughtException(Thread t, Throwable e) {
                logger.error("Uncaught Exception detected in thread {}", t, e);
            }
        });
    } catch (SecurityException e) {
        logger.error("Could not set the Default Uncaught Exception Handler", e);
    }
}
于 2012-09-13T15:23:36.790 に答える
2

Webアプリケーション、および投稿したコードスニペットで、ルートをどのように処理していますExceptionか?あなたがそれを捕まえて、それを記録して、次に進むように見えます。

Webアプリケーションの99%のケースでは、例外を<error-page>web.xmlで構成されたものまでバブルアップできるようにする方がよいでしょう。

「ビジネスファサードを呼び出す」ときに不明なエラーが発生した場合、アプリケーションが残りのロジックを追跡し続けることが最善であるとは思えません。

于 2012-09-13T15:35:47.360 に答える
1

複数のcatchブロックを追加し、Exceptioncatchを最後のものとして残します。

try {
     // call business facade
     // business facade calls DAO
     // any exception from DAO bubbles up 
} catch(SuperClassException se)
{
//Do what you want to do when this exception happens.
}catch (Exception e) {
  log.error("error", e);
}
于 2012-09-13T15:23:21.307 に答える
0

try内のコードは、ほとんどの場合、キャッチできるチェック済み例外について指定し、フラグを立てます。また、try内のコードを見ると、失敗したケースのシナリオを直感的に理解できるため、チェックされていない/実行時の例外キャッチブロックを追加できます。

于 2015-06-09T05:58:55.747 に答える