E.printStackTrace(); Deixa o sistema em produção mais pesado?

Eu sempre colocava dentro dos catch mais um amigo me deixou uma duvida, e me disse que isso deixava o sistema mais pesado em produção.
Obs : Estou usando em um container .

catch (EntityNotFoundException e) {
e.printStackTrace();
}

Abs.

Bom, se pensar faz sentido.

esse método gera um texto relativamente grande se falando de log, e quanto mais texto, mais operações de IO, quanto mais operações de IO, mais pesado fica.

Agora se é perceptível eu não sei dizer, e eu só tiraria se conseguisse substituir por algo que me dê uma explicação tão boa quanto, sobre o que houve de errado e aonde.

Rodrigo Sasaki estas mensagens são impressas no console não salvas em Log.

Mas o console do servidor geralmente é salvo em arquivo :slight_smile:

Não sabia disso não então tem sentido o que ele falou.

O problema não é saber se imprimir o stacktrace vai ter boa performance ou não. A questão realmente séria é que este tratamento de erros pode estar muito falho.

[code]catch (EntityNotFoundException e) {
e.printStackTrace();
}

// Continua execução como se nada tivesse acontecido.
[/code]
Você teria duas alternativas aqui:

  • O erro é realmente um erro. Nesse caso, NUNCA “engula” a exceção. O programa ficará com alguma coisa inconsistente, que pode fazer dar pau em um contexto diferente da causa original, mais à frente. Você terá sérias dores de cabeça para encontrar esses erros. Adote o princípio Crash Early (http://pragmatictips.com/32) e não permita que a execução continue como se nada tivesse acontecido. Sempre inclua nos logs o stacktrace da exceção.
  • O erro faz parte da operação normal. Nessa outra situação, não há motivo para imprimir um stacktrace que só servirá para poluir os logs e dar falsos alertas de erro. Aqui você pode deixar a execução prosseguir, mas documente bem o porque disso. Ex:

catch (EntityNotFoundException e) { /// Nada a fazer /// É seguro ignorar esta exceção, ela é resultado de não encontrar registros na busca pelo objeto XYZ. /// Mais à frente será feito tratamento para o caso de XYZ não cadastrado. }

Desse jeito, apenas imprimindo o stack trace você não faz nem uma coisa nem outra. Nem trata o erro e nem afirma que a exceção é esperada!

E respondendo de maneira direta á pergunta: e.printStackTrace() deve sempre ser usado quando necessário, ou seja, quando houver a possibilidade de um problema que precise ser diagnosticado. E não deve ser usado quando não há nenhum erro. Ser pesado ou leve não influi nessa decisão.

Ah, complementando.
Em aplicações de produção é preferível imprimir o stacktrace usando o framework de log (seja qual for o que vocês estejam utilizando). Assim o erro vai para todos os lugares onde está configurado para ir, e não apenas para o system.out do servidor.

Geralmente os frameworks de log tem uma chamada tipo:

logger.error("Minha mensagem de erro", e);Ao fazer assim o stacktrace do objeto “e” será impresso no log junto com a mensagem explicativa.

Boa gomesrod acho que esse é a solução mais viável mesmo.
Obrigado pelo esclarecimento.

Faço minhas as palavras do GomesRod.

Tratar exceções com seriedade é um passo extremamente importante para qualquer sistema sério.