Я голосовал за ответ Джоша , но хотел бы добавить еще один в список:
System.InvalidOperationException должно быть выброшено, если аргумент допустим, но объект находится в состоянии, в котором аргумент не должен использоваться.
Обновление Взято из MSDN:
InvalidOperationException используется в
случаи, когда неспособность вызвать
Метод вызван причинами, отличными от
неверные аргументы.
Допустим, у вашего объекта есть метод PerformAction (действие enmSomeAction), допустимыми являются enmSomeActions Open и Close. Если вы вызываете PerformAction (enmSomeAction.Open) два раза подряд, то второй вызов должен вызвать исключение InvalidOperationException (поскольку arugment был действителен, но не для текущего состояния элемента управления)
Поскольку вы уже поступаете правильно, программируя в обороне, я должен упомянуть еще одно исключение - 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 день), вы бы не имели дело с самим диапазоном, и я бы выдал обобщенное исключение ArgumentException, в котором указаны действительные значения, и я также задокументировал бы их в комментариях метода.