2009-06-22 11 views
5

Stellen Sie sich vor, dass Sie eine Methode mit der folgenden Signatur haben:Should Guid.Empty Ergebnis in Argumente oder ArgumentOutOfRangeException

public void DoSomething(Guid id) 

Wenn Guid.Emtpy einen unzulässigen Wert darstellt, der Ausnahmetyp es am besten geeignet wäre, zu werfen? ArgumentException oder ArgumentOutOfRangeException?

ich leicht in Richtung Argument gelehnt, da ich nicht glaube, dass alle Guids außer Guid.Empty eine Reihe viel - es ist ein bisschen zu inclusive: Es gibt nur ein Mitglied ausgeschlossen.

Ich bin jedoch in keiner Weise bestimmt, dass dies der Fall sein sollte, also würde ich gerne hören, ob jemand Argumente für die eine oder andere bieten kann?

Ich bin mir bewusst, dass dies hauptsächlich eine semantische Diskussion ist, aber im Interesse eines guten API-Designs würde ich immer noch gerne wissen, ob es klare Fälle für die eine oder andere Option gibt.

+0

Es ist fast so, als ob Ihre Methode eine Art Guid Guide benötigt. –

+0

Vielleicht definieren Sie Ihre eigene ArgumentEmptyException? – yfeldblum

+0

@Justice. Das Hinzufügen eines neuen Ausnahmetyps für ein Szenario, in dem Sie es nie abfangen möchten, ist nicht ratsam. Mark sollte nur einen der vorhandenen Ausnahmetypen werfen. – Steven

Antwort

5

Die Angabe, dass ein leerer Wert außerhalb des Bereichs liegt, scheint einfach falsch zu sein. Da Guid.Empty normalerweise verwendet wird, wenn es überhaupt keinen definierten Wert gibt, gibt es nicht wirklich irgendeinen Wert, der außerhalb des Bereichs liegen kann.

Die Situation ähnelt der Verwendung von ArgumentNullException, außer dass für leere Werte keine spezielle Ausnahme vorliegt. Eine ArgumentNullException wäre irreführend, daher passt ArgumentException besser.

Denken Sie auch darüber nach, ob ApplicationException besser wäre. Dies wird für Ausnahmen in der Anwendung und nicht für eine Klassenbibliothek verwendet.

+1

ApplicationException ist ein bisschen redundant und wird wahrscheinlich am besten vermieden (http://stackoverflow.com/questions/52753/derive-from-) Ausnahme-oder-AnwendungException-in-Net). – adrianbanks

+0

@adrianbansk: Es geht darum, von Exception-Klassen abzuleiten, die nur kaum verwandt sind. Wenn Sie keine bestimmte Systemausnahme verwenden möchten, sodass Sie sie zusammen mit anderen Systemausnahmen abfangen können, funktioniert eine ApplicationException problemlos. – Guffa

+1

Ja, ich weiß. Was ich bekommen habe ist, dass, wenn ApplicationException von vielen als "sollte nicht Teil des .Net-Framework" sein, dann ist es möglicherweise in Zukunft veraltet. Wenn Sie die Verwendung jetzt für eine relevantere ArgumentException vermeiden, wird dieses Problem später vermieden. – adrianbanks

1

Werfen Sie eine Invalid ArgumentException. Das folgt genau der Semantik, nach der Sie suchen. Sie würden keine ArgumentOutOfRangeException werfen, wenn Sie eine uint erwarten und alle Werte außer 0xffffffff gültig sind, würden Sie?

+3

Die InvalidArgumentException ist Teil des Namespaces Microsoft.SqlServer.Management.Common. Sie möchten keine Referenz hinzufügen, nur um Zugriff auf diese Ausnahme zu erhalten. Verwenden Sie stattdessen ArgumentException, das sich im Systemnamespace befindet. – Guffa

+0

Sie haben absolut Recht. Ich hätte nur schwören können, dass ich eine InvalidArgumentException in reinem BCL-Code gesehen habe, da ich nie SqlServer verwendet habe ... – OregonGhost

7

Ich würde eine ArgumentException werfen. Seine docs sagen:

Die Ausnahme, die ausgelöst wird, wenn eines der Argumente, ein Verfahren zur Verfügung gestellt nicht gültig ist.

Das ist genau das Szenario, das Sie beschreiben. Sie möchten etwas in der Art von:

throw new ArgumentException("Guid.Empty is not a valid id", "id");
0

AE.

Genau was ist der akzeptable Bereich von Guids, die Ihre Methode erwartet?

Ist CA72EE5A-5F26-11DE-BD28-13A156D89593 im akzeptablen Bereich, aber D58B3112-5F26-11DE-B0D2-5FA156D89593 ist richtig?

+0

Ich denke, der akzeptable Bereich ist 00000000-0000-0000-0000-000000000001 bis FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF. Daher denke ich, dass wir daraus schließen können, dass Mark eine ArgumentOutOfRangeException werfen sollte, da nur ein einzelner Wert ungültig ist. Er sollte eine InvalidSingleArgumentValueException werfen, aber da diese Ausnahme nicht existiert, würde ich nach ArgumentException gehen :-) – Steven

Verwandte Themen