Я проголосовал за ответ Джоша , но хотел бы добавить еще один в список:
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, в котором указаны действительные значения, и я также задокументировал бы их в комментариях метода.