Die MSDN guidelines for standard exceptions Staaten:
Gebrauchswert für den Namen des impliziten Wertparameter der Eigenschaft Setter tun.
Das folgende Codebeispiel zeigt eine Eigenschaft, die eine Ausnahme, wenn der Anrufer übergibt ein Null-Argument wirft.
public IPAddress Address
{
get
{
return address;
}
set
{
if(value == null)
{
throw new ArgumentNullException("value");
}
address = value;
}
}
Zusätzlich kann die MSDN guidelines for property design sagen:
Vermeiden Sie werfen Ausnahmen von Eigenschaft Getter.
Eigenschaftsgetter sollten einfach sein Operationen ohne irgendwelche Vorbedingungen. Wenn ein Getter eine Ausnahme auslöst, sollten Sie die Methode in Betracht ziehen, die Eigenschaft zu umzuwandeln. Diese Empfehlung gilt nicht für Indexer . Indexer können Ausnahmen aufgrund ungültiger Argumente werfen.
Es ist zulässig und akzeptabel, Ausnahmen von einem Property Setter zu werfen.
So ArgumentNullException
in dem Setter auf null
und ArgumentException
auf der leeren Zeichenkette werfen, und in dem Getter nichts tun. Da der Setter nur das Backing-Feld aufruft und Sie Zugriff auf das Backing-Feld haben, können Sie leicht sicherstellen, dass es keinen ungültigen Wert enthält. Der Getterwurf ist dann sinnlos. Dies könnte jedoch ein guter Ort sein, um Debug.Assert
zu verwenden.
Wenn Sie wirklich keinen geeigneten Standard zur Verfügung stellen können, dann nehme ich Dir drei Möglichkeiten:
einfach zurückgeben, was auch immer in der Eigenschaft und Dokument dieses Verhalten im Rahmen des Nutzungsvertrages ist. Lassen Sie den Anrufer damit umgehen. Sie können auch einen gültigen Wert im Konstruktor anfordern. Dies kann jedoch für Ihre Anwendung völlig ungeeignet sein.
Ersetzen Sie die Eigenschaft durch Methoden: Eine Setter-Methode, die beim Übergeben einen ungültigen Wert auslöst, und eine Getter-Methode, die InvalidOperationException
auslöst, wenn der Eigenschaft nie ein gültiger Wert zugewiesen wurde.
Werfen Sie InvalidOperationException
aus dem Getter, da Sie in Betracht ziehen könnten "Eigenschaft wurde nie zugewiesen" einen ungültigen Zustand. Obwohl Sie normalerweise nicht von Gettern werfen sollten, könnte dies ein guter Grund sein, eine Ausnahme zu machen.
Wenn Sie Optionen 2 oder 3 wählen, sollten Sie umfassen auch eine TryGet- Methode, die eine bool
zurückgibt, die, wenn die Eigenschaft anzeigt, auf einen gültigen Wert gesetzt worden ist, und wenn wieder so diesen Wert in einem out
Parameter . Sonst erzwingt man Anrufer, mit einem InvalidOperationException
fertig zu werden, es sei denn, sie haben zuvor die Eigenschaft selbst eingestellt und wissen somit, dass sie nicht werfen wird. Vergleichen Sie int.Parse
gegenüber int.TryParse
.
Ich würde vorschlagen, Option 2 mit der TryGet-Methode zu verwenden. Es verletzt keine Richtlinien und stellt minimale Anforderungen an den aufrufenden Code.
Über die anderen Vorschläge
ApplicationException
ist viel zu allgemein. ArgumentException
ist ein bisschen zu allgemein für null
, aber ansonsten gut.MSDN docs again:
Sie die spezifischste (die meisten abgeleitet) Ausnahme auslösen, die geeignet ist. Wenn beispielsweise eine Methode ein Null-Argument (Nothing in Visual Basic) empfängt, sollte stattdessen System.ArgumentNullException des Basistyps System.ArgumentException ausgelöst werden.
In der Tat sollten Sie nicht ApplicationException
verwenden bei allen (docs): System.Exception Klasse statt der T: System.ApplicationException Klasse
Sie benutzerdefinierte Ausnahmen von der T abzuleiten.
Ursprünglich wurde angenommen, dass benutzerdefinierte Ausnahmen von der ApplicationException-Klasse abgeleitet werden sollten. Es wurde jedoch nicht gefunden, dass dies einen signifikanten Wert hinzufügt. Weitere Informationen finden Sie unter Bewährte Methoden für die Behandlung von Ausnahmen.
InvalidOperationException
ist nicht beabsichtigt, für wenn die Argumente auf eine Methode oder Eigenschaft ungültig sind, aber für die, wenn der Betrieb als Ganzes ist ungültig (docs). Es soll nicht aus den Setter geworfen werden:
Führen Sie eine System.InvalidOperationException Ausnahme, wenn in einem ungeeigneten Zustand werfen. System.InvalidOperationException sollte ausgelöst werden, wenn ein Eigenschaftensatz oder ein Methodenaufruf angesichts des aktuellen Status des Objekts nicht geeignet ist. Wenn Sie beispielsweise in einen System.IO.FileStream schreiben, der zum Lesen geöffnet wurde, sollte eine System.InvalidOperationException-Ausnahme ausgelöst werden.
übrigens InvalidOperationException
ist, wenn die Operation ungültig ist für den aktuellen Zustand des Objekts. Wenn die Operation für die gesamte Klasse immer ungültig ist, sollten Sie NotSupportedException
verwenden.
Denken Sie auch an Eigenschaften sind syntaktische gezuckerte Methoden. – Dykam
Eine verwandte interessante Diskussion: http://stackoverflow.com/questions/1488472/best-practices-throwing-exceptions-from-properties – Joren