Ich habe für Joshs Antwort gestimmt , möchte aber noch eine zur Liste hinzufügen:
System.InvalidOperationException sollte ausgelöst werden, wenn das Argument gültig ist, das Objekt sich jedoch in einem Zustand befindet, in dem das Argument nicht verwendet werden sollte.
Update aus MSDN entnommen:
InvalidOperationException wird in Fällen verwendet, in denen der Fehler beim Aufrufen einer Methode auf andere Gründe als ungültige Argumente zurückzuführen ist.
Angenommen, Ihr Objekt verfügt über eine PerformAction-Methode (enmSomeAction action). Gültige enmSomeActions sind Open und Close. Wenn Sie PerformAction (enmSomeAction.Open) zweimal hintereinander aufrufen, sollte der zweite Aufruf die InvalidOperationException auslösen (da das Arugment gültig war, jedoch nicht für den aktuellen Status des Steuerelements).
Da Sie bereits das Richtige tun, indem Sie defensiv programmieren, muss ich noch eine weitere Ausnahme erwähnen: ObjectDisposedException. Wenn Ihr Objekt IDisposable implementiert, sollte immer eine Klassenvariable vorhanden sein, die den bereitgestellten Status verfolgt. Wenn Ihr Objekt entsorgt wurde und eine Methode darauf aufgerufen wird, sollten Sie die ObjectDisposedException auslösen:
public void SomeMethod()
{
If (m_Disposed) {
throw new ObjectDisposedException("Object has been disposed")
}
// ... Normal execution code
}
Update: Um Ihre Nachverfolgung zu beantworten: Es handelt sich um eine mehrdeutige Situation, die durch einen generischen Datentyp (nicht im Sinne von .NET Generics), der zur Darstellung eines bestimmten Datensatzes verwendet wird, etwas komplizierter wird. Eine Aufzählung oder ein anderes stark typisiertes Objekt wäre idealer - aber wir haben diese Kontrolle nicht immer.
Ich würde mich persönlich der ArgumentOutOfRangeException zuwenden und eine Nachricht bereitstellen, die angibt, dass die gültigen Werte 1-12 sind. Meine Argumentation ist, dass Sie, wenn Sie über Monate sprechen und davon ausgehen, dass alle ganzzahligen Darstellungen von Monaten gültig sind, einen Wert im Bereich von 1-12 erwarten. Wenn nur bestimmte Monate (wie Monate mit 31 Tagen) gültig wären, würden Sie sich nicht mit einem Bereich an sich befassen, und ich würde eine generische ArgumentException auslösen, die die gültigen Werte angibt, und ich würde sie auch in den Kommentaren der Methode dokumentieren.