Quelle est la bonne façon d’afficher la totalité d’InnerException?

Quelle est la bonne façon de montrer mon InnerException complète.

J’ai constaté que certaines de mes InnerExceptions avaient une autre InnerException et que cela allait assez loin.

InnerException.ToSsortingng() fera-t-il le travail pour moi ou dois-je parcourir les InnerExceptions et créer une Ssortingng avec SsortingngBuilder ?

Vous pouvez simplement imprimer exception.ToSsortingng() – qui inclura également le texte intégral de toutes les InnerException s nestedes.

Utilisez simplement exception.ToSsortingng()

http://msdn.microsoft.com/en-us/library/system.exception.tossortingng.aspx

L’implémentation par défaut de ToSsortingng obtient le nom de la classe qui a généré l’exception en cours, le message, le résultat de l’appel à ToSsortingng sur l’exception interne et le résultat de l’appel de Environment.StackTrace. Si l’un de ces membres est null, sa valeur n’est pas incluse dans la chaîne renvoyée.

S’il n’y a pas de message d’erreur ou s’il s’agit d’une chaîne vide (“”), aucun message d’erreur n’est renvoyé. Le nom de l’exception interne et la trace de la stack sont renvoyés uniquement s’ils ne sont pas nuls.

exception.ToSsortingng () appellera également .ToSsortingng () sur l’exception interne de cette exception, et ainsi de suite …

Je fais généralement comme ça pour supprimer la plus grande partie du bruit:

 void LogException(Exception error) { Exception realerror = error; while (realerror.InnerException != null) realerror = realerror.InnerException; Console.WriteLine(realerror.ToSsortingng()) } 

@ La réponse de Jon est la meilleure solution lorsque vous souhaitez obtenir tous les détails (tous les messages et la trace de la stack) et le plus recommandé.

Cependant, il peut y avoir des cas où vous voulez simplement les messages internes, et pour ces cas, j’utilise la méthode d’extension suivante:

 public static class ExceptionExtensions { public static ssortingng GetFullMessage(this Exception ex) { return ex.InnerException == null ? ex.Message : ex.Message + " --> " + ex.InnerException.GetFullMessage(); } } 

J’utilise souvent cette méthode quand j’ai différents auditeurs pour le traçage et la journalisation et que je souhaite avoir des vues différentes sur eux. De cette façon, je peux avoir un auditeur qui envoie toute l’erreur avec la trace de la stack à l’équipe de développement pour le débogage à l’aide de la méthode .ToSsortingng() et qui écrit un journal avec l’historique de la trace de la stack avec la méthode .GetFullMessage() .

Pour imprimer uniquement le Message faisant partie des exceptions profondes, vous pouvez faire quelque chose comme ceci:

 public static ssortingng ToFormattedSsortingng(this Exception exception) { IEnumerable messages = exception .GetAllExceptions() .Where(e => !Ssortingng.IsNullOrWhiteSpace(e.Message)) .Select(e => e.Message.Trim()); ssortingng flattened = Ssortingng.Join(Environment.NewLine, messages); // <-- the separator here return flattened; } public static IEnumerable GetAllExceptions(this Exception exception) { yield return exception; if (exception is AggregateException aggrEx) { foreach (Exception innerEx in aggrEx.InnerExceptions.SelectMany(e => e.GetAllExceptions())) { yield return innerEx; } } else if (exception.InnerException != null) { foreach (Exception innerEx in exception.InnerException.GetAllExceptions()) { yield return innerEx; } } } 

Cela passe récursivement dans toutes les exceptions internes (y compris la casse d’ AggregateException s) pour imprimer toute la propriété Message contenue dans celles-ci, délimitée par un saut de ligne.

Par exemple

 var outerAggrEx = new AggregateException( "Outer aggr ex occurred.", new AggregateException("Inner aggr ex.", new FormatException("Number isn't in correct format.")), new IOException("Unauthorized file access.", new SecurityException("Not administrator."))); Console.WriteLine(outerAggrEx.ToFormattedSsortingng()); 

L’aggr ex a eu lieu.
Aggr intérieur
Le numéro n’est pas au format correct.
Accès non autorisé aux fichiers.
Pas administrateur.


Vous devrez écouter les autres propriétés d’ Exception pour plus de détails. Par exemple, Data aura des informations. Vous pourriez faire:

 foreach (DictionaryEntry kvp in exception.Data) 

Pour obtenir toutes les propriétés dérivées (pas sur la classe d’ Exception base), vous pouvez faire:

 exception .GetType() .GetProperties() .Where(p => p.CanRead) .Where(p => p.GetMethod.GetBaseDefinition().DeclaringType != typeof(Exception));