Sie müssen eine Schleife erstellen, und es ist sauberer, die Schleife in eine separate Funktion zu verschieben.
Ich habe eine Erweiterungsmethode erstellt, um damit umzugehen. Es gibt eine Liste aller inneren Ausnahmen des angegebenen Typs zurück und verfolgt Exception.InnerException und AggregateException.InnerExceptions.
In meinem speziellen Problem war das Verfolgen der inneren Ausnahmen komplizierter als gewöhnlich, da die Ausnahmen von den Konstruktoren von Klassen ausgelöst wurden, die durch Reflexion aufgerufen wurden. Die Ausnahme, die wir abfingen, hatte eine InnerException vom Typ TargetInvocationException, und die Ausnahmen, die wir tatsächlich betrachten mussten, waren tief im Baum vergraben.
public static class ExceptionExtensions
{
public static IEnumerable<T> innerExceptions<T>(this Exception ex)
where T : Exception
{
var rVal = new List<T>();
Action<Exception> lambda = null;
lambda = (x) =>
{
var xt = x as T;
if (xt != null)
rVal.Add(xt);
if (x.InnerException != null)
lambda(x.InnerException);
var ax = x as AggregateException;
if (ax != null)
{
foreach (var aix in ax.InnerExceptions)
lambda(aix);
}
};
lambda(ex);
return rVal;
}
}
Die Verwendung ist ziemlich einfach. Wenn Sie zum Beispiel wissen möchten, ob wir auf a gestoßen sind
catch (Exception ex)
{
var myExes = ex.innerExceptions<MyException>();
if (myExes.Any(x => x.Message.StartsWith("Encountered my specific error")))
{
}
}
LibraryException -> LibraryException -> LibraryException -> MyException
. Meine Ausnahme ist immer die letzte in der Kette und hat keine eigene innere Ausnahme.