First off, I want to acknowledge that I understand that these are separate concepts with their own domain of purpose.
With that being said I occasionally find myself wondering if the best way to handle something is with Contracts, good testing, or exceptions in the event of improper usage.
Take for example non-trivial requirements on input such as sanity checks and validation, are those the domain of Contracts or are they better handled by exceptions? What if they aren't exceptional but simply against the design? What if they won't cause unpredictable behavior but only potentially undesirable or 'astonishing' behavior? You could argue that this design ambiguity is a code smell but sometimes it is unavoidable at least as far as pragmatism allows.
I was wondering if anyone had guidelines on this topic they'd be willing to offer up?