Frage

Manchmal nicht, daß ich Hexe Ausnahmetyp kennen sollte ich werfen. Also habe ich in der Regel Exception werfen (). Gibt es einen schönen Artikel über diese?

War es hilfreich?

Lösung

Wenn Sie keinen Versuch machen von einem Fehler zu erholen, können Sie einfach einen Exception mit einem String werfen Ihnen sagen, was schief gelaufen ist. (Oder wenn Sie die gleiche Aktion durchführen, unabhängig davon, was Fehler aufgetreten ist).

Anders als es offensichtlich für einen Programmierer zu machen, was einen neuen Ausnahme-Namen unter Verwendung eher schief gelaufen ist, als es in der Nachricht setzen, und Ausnahme kann Daten zu helfen Sie aus einer bestimmten Ausnahme erholen enthält.

Zum Beispiel hat ein ArgumentNullException eine Eigenschaft ParamName, die Sie einstellen sollen, wenn Sie die Ausnahme werfen. Wenn die Anrufer fangen, kann er dann diese Eigenschaft schauen und entscheiden, einen neuen Wert für das Argument zu übergeben, die den Fehler verursacht hat, oder kann einen entsprechenden Fehler drucken die Programmierer zu informieren, was falsch gelaufen ist.

Es ist bedauerlich, dass Ausnahmen nur selten ihr volles Potenzial genutzt werden (in vielen Open-Source-APIs und so weiter), und werden oft einfach eingefügt, um einen Programmierer zu informieren, was falsch gelaufen ist. Es gibt nicht viel Unterschied zwischen diesen 2, wenn Sie nicht vorhaben, die ParamName Eigenschaft zu lesen, wenn Sie ihn zu fangen. (Viele Leute werden sich nicht die Mühe, und nur eine Exception fangen sowieso).

throw new ArgumentNullException("arg1");
throw new Exception("arg1 is null");

Es kann schwierig sein, von einem Fehler zu erholen vollständig, aber in einigen Anwendungen aber Sie könnten es wünschenswert, benutzerdefinierte Ausnahmen zu schaffen, die alle Details zur Verfügung stellen, die Sie benötigen.

Im Moment würde ich nur Exception in den Object Browser-Suche in VS gesetzt, und sehen, was es ohnehin schon ist. Ihre Namen sind ziemlich selbsterklärend, so sollten Sie in der Lage sein, etwas passend auszuwählen.

Andere Tipps

Das Problem mit einer generischen Ausnahme zu werfen ist, dass es die Fähigkeit des Codes schränkt weiter den Stapel um es richtig zu behandeln (dh beste Praxis ist zu stoppen die spezifische Ausnahme möglich, bevor sie wieder fallen, und nur capture was Sie können, Griff).

Jeffrey Richter hat einen ausgezeichneten Abschnitt über die Ausnahmebehandlung (einschließlich Informationen über das System.Exception-Namespace) in CLR via C #

"Framework Design Guidelines" von Cwalina und Abrahms deckt dieses Thema wirklich gut (IMHO).

Es ist für kostenlose Online- hier , oder das Buch (nicht kostenlos) hier (UK) oder hier (US) . Suchen Sie in dem Abschnitt mit dem Titel Design-Richtlinien für Ausnahmen .

Nun, das einzige, was Sie nicht tun sollten ist throw Exception selbst.
Immer für eine geeignete Unterklasse.

Ich weiß nicht, jede Veröffentlichung Rechtschreibung heraus, welche Ausnahme, wenn zu werfen, aber ArgumentException und InvalidOperationException sollen die meisten Ihre Fälle kümmern.

Stellen Sie getrennte Fragen zu getrennten Fällen, wenn sie kommen.

Ich würde vorschlagen, Ausnahmen in einigen Kategorien, basiert auf dem Systemzustand Dividieren:

  1. Das Verfahren in einer solchen Art und Weise nicht nachgewiesen, dass es nichts tat; der Zustand der zugrunde liegenden Daten nicht gestört wurde, und ist wahrscheinlich gültig. Typische Szenarien: Der Versuch, aus einer Sammlung ein Objekt abzurufen, die nicht da ist, oder man hinzufügen, die ohnehin schon ist. Ein weiteres mögliches Szenario: eine Timeout Kommunikation in Fällen, in denen es nicht entstehen, soll Datenverlust haben (und wurden den Vorgang wiederholen gelingen könnte, wenn das Problem ist nur, dass das andere Ende einfach zu langsam war).
  2. Das Verfahren in einer Art und Weise versagt, die die zugrunde liegende Datenstruktur gestört hat, oder die zugrundeliegende Datenstruktur kann vorher beschädigt. Weitere Operationen sollten nicht mit dieser Datenstruktur versucht werden, es sei denn, Schritte zur Validierung getroffen werden. Ein weiteres mögliches Szenario: ein Kommunikations-Timeout tritt auf, wenn ein Datensatz teilweise abgerufen wurde, und die teilweise abgerufenen Daten werden nun verloren. In Abhängigkeit von dem Protokoll, kann es notwendig sein, um eine gewisse Erholung Aktion auf der Verbindung durchzuführen, oder um es zu schließen und ein neues einzuleiten.
  3. Es ist etwas ernsthaft falsch mit dem Systemzustand, und die Erholung ist wahrscheinlich nicht möglich.

Leider vorhandene .net Ausnahmen paßt nicht so etwas wie dieses Muster; es wäre schön gewesen, wenn es eine Art waren ExceptionBase aus denen Dinge wie Threadabort, CpuHasCaughtFireException, und der ‚normalen‘ Exception abgeleitet wurden, und alle ‚normalen‘ Ausnahmen wurden von Exception abgeleitet. Ich verstehe, dass .net 4.0 etwas in einer solchen Konstruktion Kludges, aber ich weiß nicht, die genaue Mechanik. Auf jeden Fall würde ich vorschlagen, dass alle benutzerdefinierten Ausnahmen in Gruppen wie oben verteilt werden sollten, mit allen Ausnahmen in jeder Gruppe einen gemeinsamen Vorfahren unterscheidet sich von anderen Gruppen teilen.

Es ist ein Artikel von Krzysztof Cwalina ( "Principal Architect auf dem .NET Framework-Team bei Microsoft") genannt

scroll top