Quelle est la bonne façon de montrer mon plein InnerException
.
J'ai trouvé que certaines de mes InnerExceptions en ont une autre InnerException
et que cela est assez profond.
Fera InnerException.ToString()
- t -il le travail pour moi ou dois-je parcourir le InnerExceptions
et créer un String
avec StringBuilder
?
c#
exception
inner-exception
Willem
la source
la source
Réponses:
Vous pouvez simplement imprimer
exception.ToString()
- cela inclura également le texte intégral de tous lesInnerException
s imbriqués .la source
ToString
méthodes personnalisées pour les exceptions internes comme détaillé dans Pourquoi System.Exception.ToString n'appelle-t-il pas virtuel ToString pour les exceptions internes? .Juste utiliser
exception.ToString()
http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx
exception.ToString () appellera également .ToString () sur l'exception interne de cette exception, et ainsi de suite ...
la source
J'aime généralement ceci pour éliminer la plupart du bruit:
Edit: J'ai oublié cette réponse et je suis surpris que personne n'ait souligné que vous pouvez simplement le faire
la source
error.GetBaseException()
. Je crois que cela fait la même chose ...La réponse de @ Jon est la meilleure solution lorsque vous voulez des détails complets (tous les messages et la trace de la pile) et celle recommandée.
Cependant, il peut y avoir des cas où vous ne voulez que les messages internes, et pour ces cas, j'utilise la méthode d'extension suivante:
J'utilise souvent cette méthode lorsque j'ai différents écouteurs pour le traçage et la journalisation et que je souhaite avoir des points de vue différents sur eux. De cette façon, je peux avoir un écouteur qui envoie toute l'erreur avec trace de pile par e-mail à l'équipe de développement pour le débogage à l'aide de la
.ToString()
méthode et un qui écrit un fichier journal avec l'historique de toutes les erreurs qui se sont produites chaque jour sans la trace de la pile avec la.GetFullMessage()
méthode.la source
ex
est unAggregateException
, aucune des exceptions internes ne sera incluse dans cette sortiePour n'imprimer que la
Message
partie des exceptions profondes, vous pouvez faire quelque chose comme ceci:Cela parcourt de manière récursive toutes les exceptions internes (y compris le cas de
AggregateException
s) pour afficher toutes lesMessage
propriétés qu'elles contiennent, délimitées par un saut de ligne.Par exemple
Vous devrez écouter les autres propriétés d' exception pour plus de détails. Par exemple
Data
aura quelques informations. Vous pourriez faire:Pour obtenir toutes les propriétés dérivées (pas sur la
Exception
classe de base ), vous pouvez faire:la source
IEnumerable<Exception>
au lieu d'un codage en durAggregrateException
pour gérer d'autres types similaires. Exclure égalementp.IsSpecialName
etpi.GetIndexParameters().Length != 0
éviter les problèmes. Inclure le nom du type d'exception dans la sortie est également une bonne idéeJe fais:
Ce "joli imprime" toutes les exceptions internes et gère également les AggregateExceptions et les cas où InnerException.Message est identique à Message
la source
Si vous voulez des informations sur toutes les exceptions, utilisez
exception.ToString()
. Il collectera les données de toutes les exceptions internes.Si vous ne voulez que l'exception d'origine, utilisez
exception.GetBaseException().ToString()
. Cela vous donnera la première exception, par exemple l'exception interne la plus profonde ou l'exception actuelle s'il n'y a pas d'exception interne.Exemple:
la source
accumulation sur la réponse de nawfal.
lors de l'utilisation de sa réponse, il manquait une variable aggrEx, je l'ai ajoutée.
fichier ExceptionExtenstions.class:
la source
e.StackTrace == null