Eu tenho um código que está registrando Exception.Message
. No entanto, li um artigo que afirma que é melhor usar Exception.ToString()
. Com o último, você retém informações mais cruciais sobre o erro.
Isso é verdade e é seguro ir em frente e substituir todo o registro de código Exception.Message
?
Também estou usando um layout baseado em XML para log4net . É possível que Exception.ToString()
possam conter caracteres XML inválidos, o que pode causar problemas?
Respostas:
Exception.Message
contém apenas a mensagem (doh) associada à exceção. Exemplo:O
Exception.ToString()
método fornecerá uma saída muito mais detalhada, contendo o tipo de exceção, a mensagem (de antes), um rastreamento de pilha e todas essas coisas novamente para exceções aninhadas / internas. Mais precisamente, o método retorna o seguinte:fonte
Além do que já foi dito, não use
ToString()
no objeto de exceção para exibir ao usuário. Apenas aMessage
propriedade deve ser suficiente ou uma mensagem personalizada de nível superior.Em termos de fins de registro, definitivamente use
ToString()
na Exceção, não apenas naMessage
propriedade, como na maioria dos cenários, você ficará coçando a cabeça onde especificamente essa exceção ocorreu e qual era a pilha de chamadas. O stacktrace teria lhe contado tudo isso.fonte
Convertendo a exceção inteira em uma seqüência de caracteres
A chamada
Exception.ToString()
fornece mais informações do que apenas o uso daException.Message
propriedade. No entanto, mesmo isso ainda deixa de fora muita informação, incluindo:Data
propriedade de coleção encontrada em todas as exceções.Há momentos em que você deseja capturar essas informações extras. O código abaixo lida com os cenários acima. Ele também grava as propriedades das exceções em uma boa ordem. Está usando o C # 7, mas deve ser muito fácil converter para versões mais antigas, se necessário. Veja também esta resposta relacionada.
Dica superior - Exceções de log
A maioria das pessoas estará usando esse código para fazer logon. Considere usar o Serilog com meu pacote NuGet Serilog.Exceptions, que também registra todas as propriedades de uma exceção, mas o faz mais rápido e sem reflexo na maioria dos casos. O Serilog é uma estrutura de registro muito avançada, que é toda a raiva no momento da escrita.
Dica superior - Rastreamentos de pilha legíveis por humanos
Você pode usar o pacote Ben.Demystifier NuGet para obter rastreamentos de pilha legíveis por humanos para suas exceções ou o pacote NuGet serilog-richers- desmystify se você estiver usando o Serilog.
fonte
Eu diria que @Wim está certo. Você deve usar
ToString()
para arquivos de log - assumindo uma audiência técnica - eMessage
, se houver, para exibir ao usuário. Alguém poderia argumentar que mesmo isso não é adequado para um usuário, para todo tipo de exceção e ocorrência lá fora (pense em ArgumentExceptions, etc.).Além disso, além do StackTrace,
ToString()
incluirá informações que você não obterá de outra forma. Por exemplo, a saída da fusão, se ativada para incluir mensagens de log na exceção "mensagens".Alguns tipos de exceção ainda incluem informações adicionais (por exemplo, de propriedades customizadas) em
ToString()
, mas não na Mensagem.fonte
Depende da informação que você precisa. Para depurar o rastreamento da pilha e a exceção interna são úteis:
fonte
Exception.ToString()
vai lhe dar, certo?StringBuilder
nesse cenário pode muito mais custar do que duas novas alocações de strings, é altamente discutível que seria mais eficiente aqui. Não é como se estivéssemos lidando com iterações. Cavalos para cursos.Em termos do formato XML para log4net, você não precisa se preocupar com ex.ToString () para os logs. Simplesmente passe o objeto de exceção e o log4net fará o resto com todos os detalhes em seu formato XML pré-configurado. A única coisa que encontro ocasionalmente é a formatação de novas linhas, mas é quando estou lendo os arquivos em bruto. Caso contrário, a análise do XML funciona muito bem.
fonte
Bem, eu diria que depende do que você deseja ver nos logs, não é? Se você estiver satisfeito com o que o ex.Message fornece, use isso. Caso contrário, use ex.toString () ou até registre o rastreamento de pilha.
fonte