birden çok temel nedeni (örneğin AggregateException
ve ReflectionTypeLoadException
) olabilir istisnalar vardır.
Ağaca gezinmek için class numaralı telefonumu oluşturdum ve ardından farklı ziyaretçileri her şeyi veya yalnızca kök nedenleri toplaması için yaptım. Örnek çıktılar here. Aşağıdaki ilgili kod pasajı.
public void Accept(ExceptionVisitor visitor)
{
Read(this.exception, visitor);
}
private static void Read(Exception ex, ExceptionVisitor visitor)
{
bool isRoot = ex.InnerException == null;
if (isRoot)
{
visitor.VisitRootCause(ex);
}
visitor.Visit(ex);
visitor.Depth++;
bool isAggregateException = TestComplexExceptionType<AggregateException>(ex, visitor, aggregateException => aggregateException.InnerExceptions);
TestComplexExceptionType<ReflectionTypeLoadException>(ex, visitor, reflectionTypeLoadException => reflectionTypeLoadException.LoaderExceptions);
// aggregate exceptions populate the first element from InnerExceptions, so no need to revisit
if (!isRoot && !isAggregateException)
{
visitor.VisitInnerException(ex.InnerException);
Read(ex.InnerException, visitor);
}
// set the depth back to current context
visitor.Depth--;
}
private static bool TestComplexExceptionType<T>(Exception ex, ExceptionVisitor visitor, Func<T, IEnumerable<Exception>> siblingEnumerator) where T : Exception
{
var complexException = ex as T;
if (complexException == null)
{
return false;
}
visitor.VisitComplexException(ex);
foreach (Exception sibling in siblingEnumerator.Invoke(complexException))
{
visitor.VisitSiblingInnerException(sibling);
Read(sibling, visitor);
}
return true;
}
[while döngüsü kullanmadan en iç istisna bul?] Arasında (
Olası yinelenen http://stackoverflow.com/questions/3876456/find-the-inner-most-exception-without-using- a-while-döngüsü) – DavidRR
Eğer bir şey varsa, diğeri çift, diğeri daha büyük ve kabul edilen doğru cevabı var. –
Soru yaşı, her zaman bir yineleme belirtmek için yönetim kriteri değildir. Örneğin, diğer sorunun, bunun sahip olduğu görüşlerin sayısından on kat fazla olduğunu düşünün. Ayrıca, kabul edilen cevap sadece soruyu soran kişinin görüşünü yansıtmaktadır. Ve son olarak, [en çok oylanan cevap] 'ın (http://stackoverflow.com/a/5792456/1497596) diğer soruya da GetBaseException()' ı sunduğunu, ancak bazı durumlarda sınırlamalarını gösterdiğine dikkat edin. – DavidRR