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


18

La nostra applicazione web sta usando un ExceptionMapperper 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());
}

Non stiamo rilanciando la stessa eccezione , quindi la mia domanda è se questo sarebbe considerato un antipasto Log and Throw . E quindi, sarebbe meglio rimuovere la registrazione in posti simili e spostarli nelle varie ExceptionMapperclassi 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();
  }
}

3
Ti fermerei non appena ti sarai registrato ex.getMessage(), è già sbagliato.
biziclop,



IMO non è proprio giusto non menzionare affatto che si tratta di un servizio web. Questo cambia davvero le regole del gioco, perché ad esempio l'uso di normali meccanismi di gestione delle eccezioni può essere un rischio per la sicurezza; non si desidera che qualsiasi eccezione venga rispedita in una risposta di errore 500, che deve essere verificata e filtrata. La registrazione aggressiva in loco è anche molto più comune quando si tratta di sistemi con client esterni che la invocano direttamente. La registrazione di stacktrace nelle chiamate di servizio che vengono invocate ripetutamente può portare a dimensioni dei file di registro non gestibili e problemi di prestazioni.

@Gimby In questo caso OP non invia alcun dettaglio di errore nella risposta (probabilmente un contenuto di "errore si è verificato" sulla piastra della caldaia). Inoltre, come si diagnostica un problema senza stacktrace? I logger a rotazione si occupano abitualmente delle dimensioni della memoria e i dati dei registri sono comprimibili in modo imbarazzante.
Marko Topolnik,

Risposte:


36

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

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

Se hai seguito le migliori pratiche per:

  1. non catturare affatto (lasciare che l'eccezione si propaghi da sola);
  2. se sei costretto a prendere un'eccezione controllata, avvolgi in deselezionato e ripeti;
  3. non registrare nulla tranne che al livello superiore;
  4. registra l'intero stacktrace di eccezione con log.error("Error occurred", e);

allora non dovresti affrontare alcun dilemma, incluso quello attuale, perché lo stack stack registrato includerebbe anche tutte le eccezioni racchiuse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.