Głosowałem za odpowiedzią Josha , ale chciałbym dodać jeszcze jedną do listy:
System.InvalidOperationException należy zgłosić, jeśli argument jest prawidłowy, ale obiekt jest w stanie, w którym argument nie powinien być używany.
Aktualizacja pobrana z MSDN:
InvalidOperationException jest używany w przypadkach, gdy niepowodzenie wywołania metody jest spowodowane przyczynami innymi niż nieprawidłowe argumenty.
Powiedzmy, że twój obiekt ma metodę PerformAction (akcja enmSomeAction), prawidłowe enmSomeActions to Otwórz i Zamknij. Jeśli wywołasz PerformAction (enmSomeAction.Open) dwa razy z rzędu, drugie wywołanie powinno zgłosić wyjątek InvalidOperationException (ponieważ arugment był prawidłowy, ale nie dla bieżącego stanu formantu)
Ponieważ już robisz właściwą rzecz, programując defensywnie, mam jeszcze jeden wyjątek, o którym warto wspomnieć, to ObjectDisposedException. Jeśli twój obiekt implementuje IDisposable, to zawsze powinieneś mieć zmienną klasy śledzącą stan usunięty; jeśli twój obiekt został usunięty i zostanie wywołana metoda, powinieneś zgłosić ObjectDisposedException:
public void SomeMethod()
{
If (m_Disposed) {
throw new ObjectDisposedException("Object has been disposed")
}
// ... Normal execution code
}
Aktualizacja: Odpowiadając na dalsze uwagi: sytuacja jest trochę niejednoznaczna i jest trochę bardziej skomplikowana przez ogólny (nie w sensie .NET Generics) typ danych używany do reprezentowania określonego zestawu danych; wyliczenie lub inny silnie wpisany obiekt byłby bardziej idealny - ale nie zawsze mamy taką kontrolę.
Osobiście skłaniałbym się do ArgumentOutOfRangeException i udostępnił komunikat wskazujący, że prawidłowe wartości to 1-12. Moje rozumowanie jest takie, że kiedy mówisz o miesiącach, zakładając, że wszystkie liczby całkowite miesięcy są prawidłowe, to oczekujesz wartości z zakresu 1-12. Gdyby tylko niektóre miesiące (takie jak miesiące, które miały 31 dni) były ważne, nie miałbyś do czynienia z Range per se i rzuciłbym ogólny ArgumentException, który wskazywałby prawidłowe wartości, a także udokumentowałbym je w komentarzach do metody.