Over the top Error handling?

I am in the process of fool proofing 2 time based classes I have created.

Currently any error made by the user causes a run time exception with a given detail, but how far is too far? Should I be using normal exceptions and letting the user catch the error? The things that will cause the error are common sense, should not really occur.

For example.

A user creates a new clock, they set it as a 12 hour clock. They then try to set the time to 17:00:00 (HH:MM:SS), this throws a run time exception telling them that value is out of scope for a 12 hour clock.

This seems like a valid reason for throwing such an error, but in what cases should I be letting the user catch it?

I was thinking in a situation like so:

User creates a Stopwatch, sets the time to 5 seconds and then tries to reset it without stopping it, this causes weird behaviour (it resets the countdown time, the last update time and the current total time in milliseconds, resetting while running could cause the clock to run forever if the user coded it wrong). Should I let them catch this error and stop it in the catch block?

Or simply do nothing? It is clear they want to reset it but maybe they forgot to reset it.

When should I use each? I understand that a run time exception should be thrown if the program simply can’t do without the attempted code execution, and normal exceptions are for non dependent code/user input errors.

What are the exceptions (no pun intended) when deciding which to use?