Esta questão foi gerada por uma discussão em torno deste artigo , onde não recebi nenhuma boa resposta.
Por que registrar sua exceção e, em seguida, lançá-la novamente (preservando o rastreamento de pilha original, é claro) seria uma má ideia se você não pode lidar com isso de outra forma?
Respostas:
Presumo que a resposta seja em grande parte porque você está pegando se não consegue lidar com isso? Por que não deixar quem pode lidar com isso (ou quem fica sem escolha a não ser lidar com isso) registrá-lo, se eles acham que é digno de log?
Se você capturá-lo, registrá-lo e lançá-lo novamente, não haverá como o código upstream saber que você já registrou a exceção e, portanto, a mesma exceção pode ser registrada duas vezes. Ou pior, se todo o código upstream seguir o mesmo padrão, a exceção pode ser registrada um número arbitrário de vezes, uma para cada nível no código que decide capturá-lo, registrá-lo e lançá-lo novamente.
Além disso, alguns podem argumentar que, como lançar e capturar exceções são operações relativamente caras, toda essa captura e relançamento não está ajudando no desempenho do tempo de execução. Nem está ajudando seu código em termos de concisão ou facilidade de manutenção.
fonte
Log-and-throw é um bom padrão se a entidade que captura e relança a exceção tem motivos para acreditar que ela contém informações que não serão registradas posteriormente na pilha de chamadas - pelo menos não da maneira mais desejada. Alguns motivos pelos quais isso pode ocorrer:
fonte
e.getMessage()
/ stacktrace na IU, bem como enviá-lo como resposta REST) deve ser tratado como vulnerabilidade em si, pois a exceção de tempo de execução pode conter qualquer tipo de informação sensível. Em relação ao # 2: você pode relançar a exceção adicionando todas as informações que deseja que o cliente saiba (+ causa raiz), sem necessidade de registrar nada.Eu acho que o motivo mais simples é que você normalmente teria um único manipulador de nível superior fazendo isso para você, então não há necessidade de poluir o código com esse tratamento de exceção.
O argumento das preocupações transversais é basicamente que é uma perda de tempo lidar com erros que não dizem respeito a você. Muito melhor deixar o erro borbulhar na pilha de chamadas até que um manipulador apropriado seja encontrado.
Em minha opinião, a única vez em que você deve capturar uma exceção é quando pode fazer algo útil com os resultados. Pegar simplesmente para registrar não é útil, porque você poderia centralizar esse trabalho mais adiante.
fonte
O registro e lançamento da IMO é uma violação clara do Princípio da Menor Surpresa.
Se a exceção for tratada adequadamente mais acima na pilha de chamadas, pode não valer a pena uma entrada de log de erros. E então é confuso encontrar uma entrada de log de erro.
fonte