Um nur den MessageTeil der tiefen Ausnahmen hübsch auszudrucken , können Sie Folgendes tun:
public static string ToFormattedString(this Exception exception)
{
IEnumerable<string> messages = exception
.GetAllExceptions()
.Where(e => !String.IsNullOrWhiteSpace(e.Message))
.Select(e => e.Message.Trim());
string flattened = String.Join(Environment.NewLine, messages); // <-- the separator here
return flattened;
}
public static IEnumerable<Exception> 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;
}
}
}
Dies durchläuft rekursiv alle inneren Ausnahmen (einschließlich des Falls von AggregateExceptions), um alle darin Messageenthaltenen Eigenschaften zu drucken , die durch Zeilenumbrüche begrenzt sind.
Z.B
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.ToFormattedString());
Äußerer Aggr ex trat auf.
Innerer Aggr.
Die Nummer hat nicht das richtige Format.
Nicht autorisierter Dateizugriff.
Kein Administrator.
Sie müssen andere Ausnahmeeigenschaften anhören, um weitere Details zu erhalten. Zum Beispiel Datawird einige Informationen haben. Du könntest es tun:
foreach (DictionaryEntry kvp in exception.Data)
Um alle abgeleiteten Eigenschaften (nicht für die Basisklasse Exception) abzurufen, können Sie Folgendes tun:
exception
.GetType()
.GetProperties()
.Where(p => p.CanRead)
.Where(p => p.GetMethod.GetBaseDefinition().DeclaringType != typeof(Exception));