Es wird davon abgeraten, einfach zu fangen System.Exception
. Stattdessen sollten nur die "bekannten" Ausnahmen abgefangen werden.
Dies führt manchmal zu unnötigem, sich wiederholendem Code, zum Beispiel:
try
{
WebId = new Guid(queryString["web"]);
}
catch (FormatException)
{
WebId = Guid.Empty;
}
catch (OverflowException)
{
WebId = Guid.Empty;
}
Ich frage mich: Gibt es eine Möglichkeit, beide Ausnahmen abzufangen und nur die WebId = Guid.Empty
einmal anrufen?
Das angegebene Beispiel ist recht einfach, da es sich nur um eine GUID
. Stellen Sie sich aber einen Code vor, bei dem Sie ein Objekt mehrfach ändern, und wenn eine der Manipulationen erwartungsgemäß fehlschlägt, möchten Sie die "Rückstellung" der object
. Wenn jedoch eine unerwartete Ausnahme auftritt, möchte ich diese trotzdem höher setzen.
8 Stimmen
Wenn Sie .net 4 und höher verwenden, bevorzuge ich die Verwendung von Aggregateexception msdn.microsoft.com/de-us/library/system.aggregateexception.aspx
2 Stimmen
Bepenfriends- Seit System.Guid wirft nicht AggregateException Es wäre toll, wenn Sie (oder jemand) eine Antwort posten könnte, die zeigt, wie Sie es in eine AggregateException usw. einpacken würden.
1 Stimmen
Zur Verwendung
AggregateException
: Auslösen einer AggregateException in meinem eigenen Code31 Stimmen
"Es wird davon abgeraten, einfach System.Exception abzufangen." -und wenn die Methode 32 Arten von Ausnahmen auslösen kann, was tut man dann? für jede von ihnen separat fangen schreiben?
1 Stimmen
Behalten Sie es so bei, wie Sie es haben. Verschieben Sie den Code zu einem Fehler-Handler, wenn Sie so theres nur eine Zeile pro catch-Anweisung wünschen.
13 Stimmen
Wenn eine Methode 32 verschiedene Arten von Ausnahmen auslöst, ist sie schlecht geschrieben. Es ist entweder nicht fangen Ausnahmen es ist eigene Anrufe machen, es ist tun, viel zu viel in einer Methode, oder die Mehrheit / alle diese 32 sollte eine einzige Ausnahme mit einem Grund-Code sein.
2 Stimmen
Die akzeptierte Antwort ist nicht mehr aktuell; sehen Sie sich stattdessen diese an, da sie mit einer Bearbeitungsklausel am Anfang aktualisiert worden ist: stackoverflow.com/a/19329123/398630
1 Stimmen
Da dies in keiner der Antworten, die ich überflogen habe, erwähnt wurde, möchte ich nur sagen, dass Ihre anfängliche Aussage falsch ist. "Es ist nicht ratsam, einfach zu fangen
System.Exception
", ist nicht korrekt, es gibt sehr triftige Gründe, dies zu tun, es wird davon abgeraten nur fangenSystem.Exception
1 Stimmen
@giorgi, ich bin mir nicht sicher, ob das ein guter Leitfaden ist. Der Code sollte 32 Probleme nicht getrennt lösen, wenn die Lösung dieselbe ist. Wenn Sie dasselbe für xxxException und yyyException und Exception tun, fangen Sie einfach Exception (Elternteil der anderen beiden).
0 Stimmen
@Flynn1179, nicht unbedingt. Wenn Sie einen try..catch-Block auf der obersten Ebene Ihrer Anwendung haben, werden Sie die Fehler für mehrere Schichten erfassen. Sie fangen also potenziell IO-, DB-, http-, Comm-, Argument- und Domain-Ausnahmen ab.
0 Stimmen
@zameb, ich bezog mich auf Giorgis Beispiel einer einzelnen Methode, die zu viele Ausnahmen auslöst. Wie diese abgefangen werden, ist für meinen Punkt nicht relevant.