หากต้องการพิมพ์สวยMessage
ๆ ยกเว้นข้อลึกคุณสามารถทำสิ่งนี้:
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;
}
}
}
การทำซ้ำนี้จะทำผ่านข้อยกเว้นภายในทั้งหมด (รวมถึงกรณีของAggregateException
s) เพื่อพิมพ์Message
คุณสมบัติทั้งหมดที่มีอยู่ในนั้นคั่นด้วยการแบ่งบรรทัด
เช่น
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 นอก
Inner aggr เช่น
หมายเลขไม่อยู่ในรูปแบบที่ถูกต้อง
การเข้าถึงไฟล์โดยไม่ได้รับอนุญาต
ไม่ใช่ผู้ดูแลระบบ
คุณจะต้องฟังคุณสมบัติข้อยกเว้นอื่น ๆเพื่อดูรายละเอียดเพิ่มเติม สำหรับเช่นData
จะมีข้อมูลบางอย่าง คุณสามารถทำได้:
foreach (DictionaryEntry kvp in exception.Data)
ในการรับคุณสมบัติที่ได้รับทั้งหมด (ไม่ใช่Exception
คลาสพื้นฐาน) คุณสามารถทำได้:
exception
.GetType()
.GetProperties()
.Where(p => p.CanRead)
.Where(p => p.GetMethod.GetBaseDefinition().DeclaringType != typeof(Exception));