2010-01-25 17 views
7

Gibt es einen bekannten Grund, warum FormatException nicht von ArgumentException erbt? Ein ungültiges Format scheint ein sehr spezifischer Fall zu sein, in dem ein Argument ungültig ist, ähnlich wie ArgumentOutOfRangeException.Warum erbt FormatException nicht von ArgumentException?

Die MSDN article for the class Staaten:

Format ausgelöst wird, wenn das Format eines Arguments in einem Methodenaufruf Parameter-Typs nicht das Format des entsprechenden formalen entsprechen. Beispiel: Wenn eine Methode einen String Parameter angibt, der aus zwei Ziffern mit einem eingebetteten Punkt besteht, würde das Übergeben eines entsprechenden Zeichenfolgenarguments mit nur zwei Ziffern an diese Methode dazu führen, dass FormatException ausgelöst wird.

Klingt wie nur das Szenario für eine ArgumentException oder abgeleitete Klasse für mich.

All dies bedeutet, dass Sie nicht mit FormatException unter der größeren Ausnahmefamilie ArgumentException umgehen können, noch können Sie identifizieren, welcher Parameter verursacht die Ausnahme ausgelöst werden.

Gibt es einen Grund dafür, dass diese scheinbar außer Haus gesetzte Ausnahme wo sein soll?

Antwort

13

FormatException wird nicht notwendigerweise ausgelöst, wenn ein formales Argument einer Methode ungültig ist. Es kann auch vorkommen, wenn die Methode eine externe Ressource verbraucht und das Format der Daten von der externen Ressource nicht geeignet ist.

Zum Beispiel wird BinaryReader.Read7BitEncodedIntFormatException werfen, wenn das, was es aus einem Stream liest, keine gültige 7-Bit-codierte Ganzzahl ist. Es braucht überhaupt keine Argumente. ArgumentException dagegen sollte nur ausgelöst werden, wenn ein als formaler Parameter an eine Methode übergebenes Argument ungültig ist.

Die Beschreibung, auf die Sie im MSDN-Artikel verwiesen haben, ist restriktiver als FormatException. Dies ist wirklich und sollte geklärt werden.

+0

Das ist ein überzeugendes Argument genug für mich. Die Dokumentation, die die Klasse umgibt, ist einfach irreführend, wenn sie Argumente erwähnt, die in der Ausnahme verwendet werden. –

+0

Downvoter: Möchten Sie das erklären? Ich frage mich, was in dieser Antwort wirklich "downvote-fähig" ist. –

+0

Es ist ein Miss-Klick auf meinen Teil, den ich SO zu der Zeit nicht rückgängig machen lassen würde. Wenn Sie Ihre Antwort bearbeiten, würde ich es gerne rückgängig machen. –

5

Das ist ein bisschen patzig aber Richter in CLR Via C# (Seite 432) schlägt vor, dass vielleicht ist es da Exception Klassenhierarchie nicht sehr gut in .NET implementiert wurde:

Microsofts ursprüngliche Idee war, dass System.Exception wäre der Basistyp für alle Ausnahmen und dass zwei andere Typen, System.SystemException und System.ApplicationException die einzigen zwei Typen wären, die sofort von Exception abgeleitet werden. Darüber hinaus werden Ausnahmen, die von der CLR ausgelöst werden, von SystemException abgeleitet, und alle von der Anwendung ausgelösten Ausnahmen würden von ApplicationException abgeleitet. Auf diese Weise könnten Entwickler einen catch-Block schreiben, der alle von der Anwendung ausgelösten Ausnahmen abfängt.

Allerdings ... wurde diese Regel nicht sehr gut befolgt; einige Ausnahmen sind sofort abgeleitet von Exception (IsolatedStorageException), einige CLR geworfen Ausnahmen sind abgeleitet von ApplicationException ... So ist es eine ganze Unordnung, und das Ergebnis ist, dass die und ApplicationException Arten haben keine besondere Bedeutung überhaupt. An dieser Stelle möchte Microsoft sie aus der Ausnahmeklassenhierarchie entfernen, aber sie können es nicht, da es Code brechen würde, der bereits auf diese Typen verweist.Diese

ist nicht gerade eine Antwort auf Ihre Frage, aber ich denke, dass es relevant ist, weil ich denke, es gibt an, dass es nicht wirklich einen guten Grund, warum einige Ausnahme-Derivate wie sie es tun erben. Leider war die Exception Class Vererbung nicht so gut durchdacht & es ist eine Art Chaos.