私のアプリケーションでは、PMDを介してコードを実行しています。次のメッセージが表示されます。
- PrintStackTrace()を避けます。代わりにロガー呼び出しを使用してください。
どういう意味ですか?
例外でprintStackTrace()
を呼び出すと、トレースは_System.err
_に書き込まれ、他の場所にルーティング(またはフィルタリング)するのは困難です。これを行う代わりに、ロギングフレームワーク(またはApache Commons Loggingなどの複数のロギングフレームワークのラッパー)を使用し、そのフレームワークを使用して例外をログに記録することをお勧めします(例:logger.error("some exception message", e)
)。
それにより、次のことが可能になります。
生産品質プログラムは、エラーやその他の診断を報告するために、多くの代替ログ(log4j、logback、Java.util.loggingなど)の1つを使用する必要があります。これには多くの利点があります。
対照的に、printStackTraceを使用するだけの場合、デプロイヤ/エンドユーザーはコントロールをほとんど持たず、ログメッセージは失われたり、不適切な状況でエンドユーザーに表示される可能性があります。 (そして、ti病なユーザーをランダムなスタックトレースほど怖がらせるものはありません。)
Simpleでは、スタックトレースを標準エラーに出力するだけなので、e.printStackTrace()はお勧めできません。このため、この出力がどこに行くかを実際に制御することはできません。
ほとんどすべてのロギングフレームワークは、スロー可能なオブジェクトをメッセージとともに渡すことができるメソッドを提供します。好む:
public trace(Marker marker, String msg, Throwable t);
スロー可能オブジェクトのスタックトレースを出力します。
会社のコンセプトから話しましょう。 Logは柔軟なレベルを提供します( logger.infoとlogger.debugの違い を参照)。 QA、開発者、ビジネスマンなど、さまざまな人がさまざまなレベルを見たいと思っています。ただし、e.printStackTrace()はすべてを出力します。また、このメソッドが安静に呼び出される場合のように、この同じエラーが複数回出力される場合があります。社内のDevopsやTech-Opsの人たちは、同じエラーリマインダーを受け取るのでおかしくなるかもしれません。 log.error("errors happend in XXX", e)
の方が良い代替品になると思います。これはe.printStackTrace()よりも読みやすい情報全体を出力します。