Я проголосував за відповідь Джоша , але хотів би додати ще один до списку:
System.InvalidOperationException слід кинути, якщо аргумент дійсний, але об'єкт знаходиться в стані, коли аргумент не слід використовувати.
Оновлення, взяті з MSDN:
InvalidOperationException застосовується у випадках, коли недосвідчення методу викликано причинами, відмінними від недійсних аргументів.
Скажімо, що ваш об’єкт має метод PerformAction (enmSomeAction action), дійсними enmSomeActions є Open and Close. Якщо ви викликаєте PerformAction (enmSomeAction.Open) двічі поспіль, то другий виклик повинен кинути InvalidOperationException (оскільки аругмент був дійсним, але не для поточного стану елемента управління)
Оскільки ви вже робите правильно, захищаючи програмування, у мене є ще одне виключення - ObjectDisposedException. Якщо ваш об'єкт реалізує IDisposable, у вас завжди повинна бути змінна класу, яка відстежує розміщений стан; якщо ваш об’єкт був розміщений і на нього викликається метод, ви повинні підняти ObjectDisposedException:
public void SomeMethod()
{
If (m_Disposed) {
throw new ObjectDisposedException("Object has been disposed")
}
// ... Normal execution code
}
Оновлення: щоб відповісти на ваше подальше спостереження: це дещо неоднозначна ситуація, яка ускладнюється загальним (не в сенсі .NET Generics) типом даних, що використовуються для представлення конкретного набору даних; перерахунок або інший сильно набраний об'єкт був би більш ідеальним, але ми не завжди маємо такий контроль.
Я особисто схиляюся до ArgumentOutOfRangeException і надаю повідомлення, яке вказує, що дійсні значення - 1-12. Моє міркування полягає в тому, що якщо ви говорите про місяці, якщо вважати, що всі цілі подання місяців є дійсними, то ви очікуєте значення в діапазоні 1-12. Якби тільки певні місяці (як, наприклад, місяці, що мали 31 день) були дійсними, то ти б не мав справу з діапазоном per se, і я б кинув загальний ArgumentException, який вказав дійсні значення, і я також задокументував би їх у коментарях методу.