例外のスタックトレース自体を印刷すること自体は悪い習慣ではありませんが、例外が発生したときにトレーストレースを印刷するだけで問題が生じる可能性があります。多くの場合、スタックトレースを印刷するだけでは不十分です。
また、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
によってInterruptedException
スローされたものを処理するためにEclipseによって実際に自動生成されたものThread.sleep
です。)
ほとんどのアプリケーションでは、スタックトレースを標準エラーに出力するだけではおそらく十分ではありません。不適切な例外処理により、多くの場合、アプリケーションが予期しない状態で実行され、予期しない未定義の動作が発生する可能性があります。