web-dev-qa-db-fra.com

Est-ce toujours un contre-modèle si nous enregistrons un message d'exception et levons une exception différente?

Notre application Web utilise un ExceptionMapper pour mapper certaines exceptions à Response. Nous enregistrons les messages d'exception avant de lancer une nouvelle exception comme suit:

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

Nous ne relançons pas la même exception , donc ma question est de savoir si cela serait considéré comme --- Log and Throw antipattern . Et donc, serait-il préférable de supprimer la journalisation dans des endroits similaires et de les déplacer vers les différentes classes ExceptionMapper comme suit:

@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

Votre code ne porte en fait pas un, mais trois antipatterns:

  1. se connecter et retomber;
  2. renvoyer sans envelopper la cause d'origine;
  3. consigner uniquement le message et non la trace de pile (c'est le pire).

Si vous avez suivi la meilleure pratique pour:

  1. ne pas attraper du tout (laissez l'exception se propager d'elle-même);
  2. s'il est forcé d'attraper une exception vérifiée, encapsulez-la sans contrôle et relancez;
  3. ne connectez jamais rien sauf au niveau supérieur;
  4. consigner l'intégralité du stacktrace d'exception avec log.error("Error occurred", e);

vous ne rencontriez alors aucun dilemme, y compris le vôtre, car la trace de pile consignée inclurait également toutes les exceptions encapsulées.

37
Marko Topolnik