5

このコード片が 20 か所にあり、常に同じであると仮定します。

try {
    // do something
} catch (FirstException e) {
    // log it
} catch (SecondException e) {
    // log it
}

このようなものを使用する方が良いでしょうか、それともinstanceof良い解決策ではありませんか?

try {
    // do something
} catch(Exception e) {
    logException(e);
}

void logException(Exception e) {
    if (e instanceof FirstException) {
        // log it
    } else if (e instanceof SecondException) {
        // log it differently
    } else {
        // do something with other exception 
    }
}

私がソリューションについて本当に嫌いなのExceptionは、間違いなく最善の方法ではないキャッチです...もっと良い方法はありますか?

4

4 に答える 4

9
  1. Java 7 では、catch (FirstException1 | SecondException | ...)
  2. すべてのcatch (Exception e)例外をログに記録したいのではないですか? s とs もログに記録したいので、実際にアドバイスします。catch (Throwable t)OutOfMemoryErrorStackOverflowError

例外のロギングに関する長年の経験からのアドバイスは、すべて同じ方法でログに記録することです。例外メッセージは人間が読めるテキストとして十分であり、開発者がデバッグに本当に必要とするのはスタック トレースです。

1 つだけ注意してください。例外を早期にキャッチしないでください。アプリケーション全体の単一の場所、いわゆる例外バリアで例外をキャッチしてください。これは、作業単位に出入りするレベルです。

チェックされた例外が下位レベルで問題を引き起こしている場合は、それらを次のようにラップしますRuntimeException

try {
  ...
} 
catch (RuntimeException e) {throw e;} 
catch (Exception e) {throw new RuntimeException(e);}

アプリケーションにとってビジネスレベルの意味を持ち、現在の作業単位を中止せずにそのフローをリダイレクトする例外があることを正確かつ事前に知っている場合にのみ、その例外を下位レベルでキャッチすることが適切です。実際には、このような例外は、アプリケーション コードによってスローされる可能性のあるすべての例外の全体と比較してまれです。

于 2013-03-21T08:50:45.620 に答える
1

最初のアプローチは間違いなく優れています。Exception一般に、この場合はRuntimeExceptions もキャッチするため、キャッチするのは悪い習慣です。

于 2013-03-21T08:50:19.507 に答える
1

例外をログに記録するだけでよい場合、前者はクリーンで優れたソリューションです。

それ以外の場合は、最初のアプローチの方が優れています。

于 2013-03-21T08:50:20.127 に答える
1

「パターンへのリファクタリング」という本の中で、一般的なリファクタリングの 1 つは「instanceof をポリモーフィズムに置き換える」です。. .

そうは言っても、この特定の質問については、チェックされた例外をランタイム例外に置き換えるというSpringの哲学が思い浮かびます(しゃれを許してください)。

アイデアは、チェックされた例外が過剰に使用される可能性があるということです-例外は回復できるものですか? はいの場合、わかりました。. . そうでない場合は、チェーンを伝播させます。これは次の方法で実行できます。

  • 投げ直します。. . (しかし、それでもなお良い)
  • RuntimeException にラップする

ロギング アスペクトを作成します。

考慮すべきもう 1 つの点は、これらの例外を、チェーンを伝播するのではなく、発生した正確な時点でログに記録する必要があり、それらが 20 の異なる場所で発生する場合、それらは分野横断的な問題になるということです。. . 通常のメソッドで例外を再スローし、それをキャッチしてログに記録するアスペクトを記述できます。. . . ここでも Spring を使用すると、これが簡単になります。

于 2013-03-21T08:54:04.723 に答える