Um nur den Message
Teil 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 AggregateException
s), um alle darin Message
enthaltenen 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 Data
wird 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));