例外のスタック トレースを出力すること自体は悪い習慣ではありませんが、例外が発生したときにステータス トレースのみを出力することがおそらくここでの問題です。多くの場合、スタック トレースを出力するだけでは十分ではありません。
catch
また、ブロック内で実行されているのがe.printStackTrace
. 不適切な処理は、せいぜい問題が無視されていることを意味し、最悪の場合、プログラムが未定義または予期しない状態で実行を続けることを意味します。
例
次の例を考えてみましょう。
try {
initializeState();
} catch (TheSkyIsFallingEndOfTheWorldException e) {
e.printStackTrace();
}
continueProcessingAssumingThatTheStateIsCorrect();
ここでは、初期化が行われたことを必要とする処理に進む前に、いくつかの初期化処理を行いたいと考えています。
continueProcessingAssumingThatTheStateIsCorrect
上記のコードでは、プログラムが問題を引き起こすと思われるメソッドに進むのを防ぐために、例外をキャッチして適切に処理する必要があります。
多くの場合、e.printStackTrace()
何らかの例外が飲み込まれ、問題が発生していないかのように処理を続行できることを示しています。
なぜこれが問題になったのですか?
おそらく、貧弱な例外処理がより一般的になった最大の理由の 1 つは、Eclipse などの IDE がe.printStackTrace
例外処理のために実行するコードを自動生成する方法によるものです。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
(上記は、によってスローされたtry-catch
を処理するために Eclipse によって実際に自動生成されたものです。)InterruptedException
Thread.sleep
ほとんどのアプリケーションでは、スタック トレースを標準エラーに出力するだけではおそらく十分ではありません。多くの場合、不適切な例外処理により、アプリケーションが予期しない状態で実行され、予期しない未定義の動作につながる可能性があります。