it-swarm.com.de

Ist es immer noch ein Antimuster, wenn wir eine Ausnahmemeldung protokollieren und eine andere Ausnahme auslösen?

Unsere Webanwendung verwendet ein ExceptionMapper, um einige Ausnahmen Response zuzuordnen. Wir protokollieren die Ausnahmemeldungen, bevor wir eine neue Ausnahme auslösen, wie folgt:

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

Wir werfen nicht dieselbe Ausnahme erneut aus , daher ist meine Frage, ob dies als Log and Throw Antipattern betrachtet wird. Daher ist es besser, die Protokollierung an ähnlichen Stellen zu entfernen und sie wie folgt in die verschiedenen ExceptionMapper -Klassen zu verschieben:

@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

Ihr Code enthält tatsächlich nicht einen, sondern drei Antimuster:

  1. loggen und neu werfen;
  2. erneut werfen, ohne die ursprüngliche Ursache einzuwickeln;
  3. protokollieren Sie nur die Nachricht und nicht die Stapelverfolgung (dies ist die schlechteste).

Wenn Sie die Best Practice befolgt haben, um:

  1. überhaupt nicht fangen (die Ausnahme von selbst verbreiten lassen);
  2. wenn Sie gezwungen sind, eine aktivierte Ausnahme abzufangen, wickeln Sie sie in das Kontrollkästchen und werfen Sie sie erneut.
  3. protokollieren Sie niemals etwas anderes als auf der obersten Ebene.
  4. protokollieren Sie den gesamten Exception-Stacktrace mit log.error("Error occurred", e);

dann würden Sie keinen Dilemmata gegenüberstehen, einschließlich Ihres aktuellen, da die protokollierte Stapelverfolgung auch alle umschlossenen Ausnahmen enthalten würde.

37
Marko Topolnik