Qual é a maneira correta de mostrar a minha plenitude InnerException
.
Descobri que algumas das minhas InnerExceptions têm outra InnerException
e isso é bastante profundo.
Farei InnerException.ToString()
o trabalho para mim ou preciso fazer um loop InnerExceptions
e criar um String
com StringBuilder
?
c#
exception
inner-exception
Willem
fonte
fonte
Respostas:
Você pode simplesmente imprimir
exception.ToString()
- isso também incluirá o texto completo para todos osInnerException
s aninhados .fonte
ToString
métodos personalizados para exceções internas, conforme detalhado em Por que System.Exception.ToString não chama ToString virtual para exceções internas? .Apenas use
exception.ToString()
http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx
exception.ToString () também chamará .ToString () na exceção interna dessa exceção e assim por diante ...
fonte
Eu costumo fazer assim para remover a maior parte do ruído:
Edit: Eu esqueci esta resposta e está surpreso que ninguém apontou que você pode simplesmente fazer
fonte
error.GetBaseException()
? Eu acredito que este faz o mesmo ...@ A resposta de Jon é a melhor solução quando você deseja detalhes completos (todas as mensagens e o rastreamento da pilha) e a recomendada.
No entanto, pode haver casos em que você apenas deseja as mensagens internas e, nesses casos, eu uso o seguinte método de extensão:
Costumo usar esse método quando tenho ouvintes diferentes para rastrear e registrar e quero ter visões diferentes sobre eles. Dessa forma, posso ter um ouvinte que envia todo o erro com rastreamento de pilha por email para a equipe de desenvolvimento para depuração usando o
.ToString()
método e um que grava um arquivo de logon com o histórico de todos os erros que ocorreram todos os dias sem o rastreamento de pilha com o.GetFullMessage()
métodofonte
ex
é umAggregateException
, nenhuma das exceções internas serão incluídas nesta saídaPara imprimir apenas a
Message
parte s de exceções profundas, você pode fazer algo assim:Isso recursivamente passa por todas as exceções internas (incluindo o caso de
AggregateException
s) para imprimir todas asMessage
propriedades contidas nelas, delimitadas por quebra de linha.Por exemplo
Você precisará ouvir outras propriedades de exceção para obter mais detalhes. Por exemplo
Data
, terá algumas informações. Você poderia fazer:Para obter todas as propriedades derivadas (não na
Exception
classe base ), você pode:fonte
IEnumerable<Exception>
vez de codificadaAggregrateException
para lidar com outros tipos semelhantes. Exclua tambémp.IsSpecialName
epi.GetIndexParameters().Length != 0
evite problemas. Incluindo o nome do tipo de exceção na saída também é uma boa idéiaEu faço:
Isso "imprime" todas as exceções internas e também lida com AggregateExceptions e casos em que InnerException.Message é o mesmo que Message
fonte
Se você quiser informações sobre todas as exceções, use
exception.ToString()
. Ele coletará dados de todas as exceções internas.Se você deseja apenas a exceção original, use
exception.GetBaseException().ToString()
. Isso fornecerá a primeira exceção, por exemplo, a exceção interna mais profunda ou a exceção atual, se não houver nenhuma exceção interna.Exemplo:
fonte
acúmulo na resposta de nawfal.
ao usar sua resposta, faltava uma variável aggrEx, adicionei.
arquivo ExceptionExtenstions.class:
fonte
e.StackTrace == null