Votei na resposta de Josh , mas gostaria de adicionar mais uma à lista:
System.InvalidOperationException deve ser lançado se o argumento for válido, mas o objeto estiver em um estado em que o argumento não deve ser usado.
Atualização obtida do MSDN:
InvalidOperationException é usado nos casos em que a falha na chamada de um método é causada por outros motivos que não argumentos inválidos.
Digamos que seu objeto tenha um método PerformAction (ação enmSomeAction), enmSomeActions válidas são Open e Close. Se você chamar PerformAction (enmSomeAction.Open) duas vezes seguidas, a segunda chamada lançará InvalidOperationException (uma vez que o artigo era válido, mas não para o estado atual do controle)
Como você já está fazendo a coisa certa ao programar defensivamente, tenho uma outra exceção a ser mencionada: ObjectDisposedException. Se seu objeto implementa IDisposable, você deve sempre ter uma variável de classe rastreando o estado disposto; se seu objeto foi descartado e um método é chamado, você deve aumentar o ObjectDisposedException:
public void SomeMethod()
{
If (m_Disposed) {
throw new ObjectDisposedException("Object has been disposed")
}
// ... Normal execution code
}
Atualização: Para responder ao seu acompanhamento: É uma situação um pouco ambígua e é um pouco mais complicada por um tipo de dados genérico (não no sentido do .NET Generics) sendo usado para representar um conjunto específico de dados; um enum ou outro objeto fortemente tipado seria um ajuste mais ideal - mas nem sempre temos esse controle.
Pessoalmente, eu me inclinaria para o ArgumentOutOfRangeException e forneceria uma mensagem indicando que os valores válidos são 1-12. Meu raciocínio é que, quando você fala sobre meses, assumindo que todas as representações inteiras de meses são válidas, você espera um valor no intervalo de 1 a 12. Se apenas alguns meses (como meses com 31 dias) fossem válidos, você não estaria lidando com um intervalo per se e eu lançaria uma ArgumentException genérica que indicava os valores válidos, e também os documentaria nos comentários do método.