Untuk mencetak Message
bagian dari pengecualian yang cukup dalam, Anda dapat melakukan sesuatu seperti ini:
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;
}
}
}
Ini secara rekursif melewati semua pengecualian dalam (termasuk kasus AggregateException
s) untuk mencetak semua Message
properti yang terkandung di dalamnya, dibatasi oleh jeda baris.
Misalnya
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());
Aggr luar terjadi.
Aggr ex batin.
Angka tidak dalam format yang benar.
Akses file tidak sah.
Bukan administrator.
Anda perlu mendengarkan properti Pengecualian lainnya untuk detail lebih lanjut. Misalnya Data
akan memiliki beberapa informasi. Anda bisa melakukannya:
foreach (DictionaryEntry kvp in exception.Data)
Untuk mendapatkan semua properti turunan (bukan pada Exception
kelas dasar ), Anda bisa melakukan:
exception
.GetType()
.GetProperties()
.Where(p => p.CanRead)
.Where(p => p.GetMethod.GetBaseDefinition().DeclaringType != typeof(Exception));