I like to use: ArgumentException, ArgumentNullException, ArgumentOutOfRangeException
Edit
You could also throw as Yoooder points out bellow (vote his answer up as well), that InvalidOperationException makes sense if your given a valid argument but the method being called is not valid for the argument based on the current state.
You could also throw the NotSupportedException if the arguments passed in are just not supported. Imagine an Ftp client, and you pass a command in that the client doesn't support. This would be a valid usage as well.
The trick is to throw the exception that best expresses why the method cannot be called in the current state.
Edit
Thanks for the link I updated all to point to msdn.
Edit
In response to your followup, I would throw an ArgumentOutOfRangeException, look at what MSDN says about this exception:
ArgumentOutOfRangeException is thrown
when a method is invoked and at least
one of the arguments passed to the
method is not nullNothingnullptra null
reference (Nothing in Visual Basic)
and does not contain a valid value.
So in this case you are passing a value but that is not a valid value, since your range is 1-12. However, way you go document it make it clear what your API throws. Because although I might say ArgumentOutOfRangeException another developer might say ArgumentException. Make it easy and document the behavior.
Edit
As Yoooder again points out in the comments documentation is good but to a point. Ideally the exception should be detailed about what went wrong, why it is wrong, and how to fix it. I love when error messages point to help documentation or other resources.
For example Microsoft did a good first step with this. When you encounter the error they tell you in the error messgae the KB article. What they don't do well is tell why you it specifically failed.