Surprisingly I was only able to find one previous question on SO about this subject, and I\'d just like to get the community \"Vote of Confidence\" (or not!) on my approach.
Often both: Assert, then throw.
You assert because you want to notify developers of a mistaken assumption during development.
You throw because if this happens in a release build, you need to make sure the system doesn't continue processing while in a bad state.
The desired reliability characteristics of your system may affect your choice here, but 'assert then throw' is often a useful strategy, I think.