オンラインコードにprintStackTrace()を使用しないでください
コードを記述したら、コードを確認してください。コードにprintStackTrace()を含めないでください。printStackTrace()はコンソールに誤ったスタック情報のみを出力するため、コードのデバッグにのみ適しています。
例外をログに記録する必要がある場合は、ロギングを使用してください。
catchブロックで例外を飲み込まない
catch (NoSuchMethodException e) {
return null;
}
例外を処理しないでください。ただし、nullを返すようにしてください。これにより、例外が飲み込まれ、障害情報を取得できなくなり、将来のトラブルシューティングが非常に困難になります。
必要に応じて特定のチェック済み例外を宣言する
public void foo() throws Exception { //错误做法
}
上記のコードは呼び出し側がエラーの原因がわからないため、可能な限り回避する必要があります。
メソッド宣言では、いくつかの特定のチェック済み例外がメソッドによってスローされる可能性があります。複数ある場合は、複数を個別にスローして、このメソッドのユーザーが各例外に対して個別に特定の処理を実行し、失敗を回避できるようにします。
public void foo() throws SpecificException1, SpecificException2 {
//正确做法
}
### 始终只捕获那些可以处理的异常
catch (NoSuchMethodException e)
{
throw e; //这代码一点用都没有
}
これは基本的な概念であり、処理できる場合は再度例外をキャッチし、そうでない場合はキャッチしないでください。
catchブロックで処理できない場合は、最初にキャッチしてから直接スローしないでください。意味がありません。
Exceptionクラスを直接キャプチャするのではなく、特定のサブクラスをキャプチャしようとする
try {
someMethod();
}
catch (Exception e)
{
LOGGER.error("method has failed", e);
}
上記のコードの最大の問題は、someMethod()の開発者が特定の例外を追加し、呼び出し元が特別にそれを処理できることが期待される場合です。
ただし、呼び出し元がExceptionクラスを直接キャッチする場合、someMethodの特定の変更を知ることはありません。これにより、実行中のプロセスの特定の時点でプログラムがクラッシュする可能性があります。
Throwableクラスをキャッチしない
JavaのエラーはThrowableのサブクラスにもなるため、これは深刻な問題です。しかし、エラーはJava仮想マシン自体の制御を超えています。エラーが発生した場合、Java仮想マシンはユーザーのcatch句を要求しないこともあります。
スタックトレースが失われないように、常にカスタム例外の元の例外を上書きします
catch (NoSuchMethodException e)
{
throw new MyServiceException("Some information: " + e.getMessage()); //错误做法
}
上記のコマンドは、主な例外のスタックトレースを失う可能性があります。正しい方法は次のとおりです。
catch (NoSuchMethodException e) {
throw new MyServiceException("Some information: " , e); //正确做法
}
例外をログに記録したり、例外をスローしたりできますが、両方は実行しないでください
catch (NoSuchMethodException e) {
LOGGER.error("Some information", e);
throw e;
}
上記のコードに示すように、スローとロギングにより、ログファイルに複数のログメッセージが生成される場合があります。
これにより同じ問題が発生しますが、ログにはさまざまなエラーメッセージがあり、開発者は混乱します。
最終的に例外をスローしないでください
try {
someMethod(); //抛出 exceptionOne
}
finally
{
cleanUp(); //如果在这里再抛出一个异常,那么try中的exceptionOne将会丢失forever
}
在上面的例子中,如果someMethod()抛出一个异常,并且在finally块中,cleanUp()也抛出一个异常,那么初始的exceptionOne(正确的错误异常)将永远丢失。
例外を処理するつもりがない場合は、catchブロックの代わりにfinallyブロックを使用します
try {
someMethod();
}
finally
{
cleanUp();
}
これも良い習慣です。メソッド内の他のメソッドにアクセスし、メソッドが例外をスローしてそれを処理したくないが、クリーンアップ作業を行う必要がある場合は、finallyブロックでクリーンアップします。キャッチブロックは使用しないでください。