web-dev-qa-db-ja.com

例外メッセージをログに記録して別の例外をスローしても、それは依然としてアンチパターンですか?

私たちのウェブアプリケーションはExceptionMapperを使用していくつかの例外をResponseにマッピングしています。次のように、新しい例外をスローする前に例外メッセージをログに記録します。

catch (SomeException ex) {
  LOG.error(ex.getMessage());
  throw new MyException(ex.getMessage());
}

私たちは同じ例外を再スローしないので、これは Log and Throwアンチパターン と見なされるかどうかです。したがって、同様の場所にあるログを削除して、次のようにそれらをいくつかのExceptionMapperクラスに移動する方がよいでしょう。

@Provider
public class MyExceptionMapper implements ExceptionMapper<MyException> {

  // bla bla 

  @Override
  public Response toResponse(final MyException ex) {
    LOG.error(ex.getMessage());
    return Response.status(400).entity("something").build();
  }
}
18
Diyarbakir

あなたのコードは実際には1つではなくthreeアンチパターンです:

  1. 記録して再投げる;
  2. 元の原因をラップせずに再スローします。
  3. スタックトレースではなく、メッセージのみをログに記録します(これは最悪のものです)。

あなたがベストプラクティスに従っている場合:

  1. まったくキャッチしません(例外が自動的に伝播するようにします)。
  2. チェックされた例外を強制的にキャッチする場合は、チェックされていないものにラップして再スローします。
  3. 最上位以外のログを記録しないでください。
  4. log.error("Error occurred", e);を使用して、例外スタックトレース全体をログに記録します

ログに記録されたスタックトレースにはすべてのラップされた例外も含まれるため、現在の問題を含め、ジレンマに直面することはありません。

37
Marko Topolnik