Use asserts to test and indicate preconditionspre/postconditions and invariants for your code.
It makes it so much easier to understand what the code expects and what it can be expected to handle.
An assert, IMO, is a suitable check because it is:
- efficient (usually not used in release) ,
- brief (usually a single line) and
- clear (precondition violated, this is a programming error).
I think self-documenting code is important, therefore having a check is good. Defensive, fail-fast, programming makes maintenance way easier, which is where usually most time is spent.
Update
Wrt your elaboration. It's usually good to give the end user an application that works well under bugs, i.e. shows as much as possible. Robustness is good, cause heaven only knows what will break at a critical moment.
However , developers & testers must be aware of bugs ASAP, so you probably want a logging framework with a hook that can display an alert to the user that there was a problem. The alert should probably be shown to all users, but can probably be tailored differently depending on the runtime environment.