È ancora un antipattern se registriamo un messaggio di eccezione e lanciamo un'eccezione diversa?

17

La nostra applicazione web utilizza un ExceptionMapper per mappare alcune eccezioni a Response . Registriamo i messaggi di eccezione prima di lanciare una nuova eccezione come segue:

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

Siamo non ri-lanciare la stessa eccezione , quindi la mia domanda è se questo sarebbe considerato un Log and Throw antipattern . E quindi, sarebbe meglio rimuovere la registrazione in luoghi simili e spostarli nelle diverse classi ExceptionMapper come segue:

@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();
  }
}
    
posta Diyarbakir 02.09.2015 - 16:27
fonte

1 risposta

34

Il tuo codice in realtà non include uno, ma tre antipattern:

  1. log e rethrow;
  2. ripensare senza avvolgere la causa originale;
  3. registra solo il messaggio e non lo stacktrace (questo è il peggiore)

Se hai seguito la procedura ottimale per:

  1. non cattura affatto (lascia che l'eccezione si propaga da sola);
  2. se forzato a catturare un'eccezione controllata, wrap in unschecked e rethrow;
  3. non registra mai nulla tranne che al livello più alto;
  4. registra l'intera eccezione dello stacktrace con log.error("Error occurred", e);

quindi non dovresti affrontare alcun dilemma, incluso quello attuale, perché lo stacktrace registrato includerebbe anche tutte le eccezioni avvolte.

    
risposta data 02.09.2015 - 16:35
fonte

Leggi altre domande sui tag