Exception
ist der Basistyp für alle Ausnahmen und als solcher furchtbar unspezifisch. Sie sollten diese Ausnahme niemals auslösen, da sie einfach keine nützlichen Informationen enthält. Das Aufrufen des Code-Catching für Ausnahmen konnte die absichtlich ausgelöste Ausnahme (aus Ihrer Logik) nicht von anderen Systemausnahmen unterscheiden, die völlig unerwünscht sind und auf echte Fehler hinweisen.
Der gleiche Grund gilt auch für SystemException
. Wenn Sie sich die Liste der abgeleiteten Typen ansehen, sehen Sie eine Vielzahl anderer Ausnahmen mit sehr unterschiedlicher Semantik.
NullReferenceException
und IndexOutOfRangeException
sind von einer anderen Art. Nun, dies sind sehr spezifische Ausnahmen, daher könnte es in Ordnung sein , sie zu werfen . Sie werden diese jedoch immer noch nicht werfen wollen, da sie normalerweise bedeuten, dass Ihre Logik einige tatsächliche Fehler enthält. Die Nullreferenzausnahme bedeutet beispielsweise, dass Sie versuchen, auf ein Mitglied eines Objekts zuzugreifen null
. Wenn dies in Ihrem Code möglich ist, sollten Sie null
stattdessen immer explizit nach einer nützlicheren Ausnahme suchen und diese auslösen (zum Beispiel ArgumentNullException
). In ähnlicher Weise tritt IndexOutOfRangeException
s auf, wenn Sie auf einen ungültigen Index zugreifen (für Arrays - nicht für Listen). Sie sollten immer sicherstellen, dass Sie dies überhaupt nicht tun, und zuerst die Grenzen eines Arrays überprüfen.
Es gibt einige andere Ausnahmen wie diese beiden, zum Beispiel InvalidCastException
oder DivideByZeroException
, die für bestimmte Fehler in Ihrem Code ausgelöst werden und normalerweise bedeuten, dass Sie etwas falsch machen oder nicht zuerst nach ungültigen Werten suchen. Indem Sie sie wissentlich aus Ihrem Code entfernen, erschweren Sie es dem aufrufenden Code nur, festzustellen, ob sie aufgrund eines Fehlers im Code ausgelöst wurden, oder nur, weil Sie beschlossen haben, sie für etwas in Ihrer Implementierung wiederzuverwenden.
Natürlich gibt es einige Ausnahmen (hah) von diesen Regeln. Wenn Sie etwas erstellen, das eine Ausnahme verursachen kann, die genau mit einer vorhandenen übereinstimmt, können Sie diese verwenden, insbesondere wenn Sie versuchen, einem integrierten Verhalten zu entsprechen. Stellen Sie einfach sicher, dass Sie dann einen ganz bestimmten Ausnahmetyp auswählen.
Im Allgemeinen sollten Sie jedoch immer in Betracht ziehen, eigene Ausnahmetypen für bestimmte erwartete Ausnahmen zu erstellen, es sei denn, Sie finden eine (bestimmte) Ausnahme, die Ihren Anforderungen entspricht. Insbesondere wenn Sie Bibliothekscode schreiben, kann dies sehr nützlich sein, um die Ausnahmequellen zu trennen.