私たちのウェブアプリケーションは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();
}
}
あなたのコードは実際には1つではなくthreeアンチパターンです:
あなたがベストプラクティスに従っている場合:
log.error("Error occurred", e);
を使用して、例外スタックトレース全体をログに記録しますログに記録されたスタックトレースにはすべてのラップされた例外も含まれるため、現在の問題を含め、ジレンマに直面することはありません。