Gibt es eine Möglichkeit, einen "Short Hand" -Code im LINQ-Stil zu schreiben, um zu allen Ebenen der ausgelösten InnerException (s) der Ausnahme zu gelangen? Ich würde es vorziehen, es an Ort und Stelle zu schreiben, anstatt eine Erweiterungsfunktion (wie unten) aufzurufen oder die Exception
Klasse zu erben .
static class Extensions
{
public static string GetaAllMessages(this Exception exp)
{
string message = string.Empty;
Exception innerException = exp;
do
{
message = message + (string.IsNullOrEmpty(innerException.Message) ? string.Empty : innerException.Message);
innerException = innerException.InnerException;
}
while (innerException != null);
return message;
}
};
AggregateException
sich kaum anders verhalten. Sie müssenInnerExceptions
stattdessen durch das Grundstück gehen. Hier finden Sie eine praktische Erweiterungsmethode: stackoverflow.com/a/52042708/661933 , um beide Fälle abzudecken.Antworten:
Leider bietet LINQ keine Methoden an, die hierarchische Strukturen verarbeiten könnten, sondern nur Sammlungen.
Ich habe tatsächlich einige Erweiterungsmethoden, die dabei helfen könnten. Ich habe nicht den genauen Code in der Hand, aber sie sind ungefähr so:
In diesem Fall können Sie dann die folgenden Ausnahmen auflisten:
quelle
Du meinst so etwas?
Auf diese Weise können Sie Ihre gesamte Ausnahmehierarchie wie folgt LINQEN:
quelle
Wie wäre es mit diesem Code:
Verwendung:
Beispiel für die Ausgabe:
Unter http: //nnn.mmm.kkk.ppp: 8000 / routingservice / router wurde kein Endpunkt abgehört , der die Nachricht akzeptieren konnte. Dies wird häufig durch eine falsche Adresse oder SOAP-Aktion verursacht. Weitere Informationen finden Sie unter InnerException, falls vorhanden.
InnerException: Es kann keine Verbindung zum Remote-Server hergestellt werden
InnerException: Es konnte keine Verbindung hergestellt werden, da der Zielcomputer diese aktiv abgelehnt hat. 127.0.0.1:8000
quelle
StringBuilder
hier zu verwenden. Auch die IMO-Erweiterungsmethode sollteNullReferenceException
beim Aufrufen einer Nullreferenz ausgelöst werden.Ich weiß, dass dies offensichtlich ist, aber vielleicht nicht für alle.
Dies durchläuft alle Ihre inneren Ausnahmen und gibt alle Nachrichten zurück, jedoch zusammen mit der Stapelverfolgung usw.
quelle
Sie benötigen keine Erweiterungsmethoden oder rekursiven Aufrufe:
quelle
LINQ wird im Allgemeinen verwendet, um mit Sammlungen von Objekten zu arbeiten. In Ihrem Fall gibt es jedoch wohl keine Sammlung von Objekten (sondern eine Grafik). Obwohl ein gewisser LINQ-Code möglich sein könnte, wäre er meiner Meinung nach eher verworren oder künstlich.
Auf der anderen Seite sieht Ihr Beispiel wie ein Paradebeispiel aus, bei dem Erweiterungsmethoden tatsächlich sinnvoll sind. Ganz zu schweigen von Themen wie Wiederverwendung, Kapselung usw.
Ich würde bei einer Erweiterungsmethode bleiben, obwohl ich sie möglicherweise so implementiert hätte:
Aber das ist größtenteils eine Frage des Geschmacks.
quelle
Ich denke nicht, Ausnahme ist keine IEnumerable, so dass Sie keine Linq-Abfrage für eine allein durchführen können.
Eine Erweiterungsmethode zum Zurückgeben der inneren Ausnahmen würde so funktionieren
Sie können dann alle Nachrichten mit einer Linq-Abfrage wie folgt anhängen:
quelle
Zum Hinzufügen zu anderen möchten Sie den Benutzer möglicherweise entscheiden lassen, wie die Nachrichten getrennt werden sollen:
quelle
quelle
Ich werde hier nur die prägnanteste Version belassen:
quelle
quelle
Die meisten hier vorgestellten Lösungen weisen die folgenden Implementierungsfehler auf:
null
AusnahmenAggregateException
Eine bessere Implementierung ist dies hier:
Anwendungsbeispiel:
quelle