This is a rather typical problem of handling errors. The answer usually depends on costs. What is the cost of the problem going unnoticed? What is the cost of the program getting aborted by exception?
In most cases, the cost of a program crash is not so big. The user will just restart it. In that case, you should go for unhandled exception. This way, you'll notice the bugs fast, fix them, and end up with a better program.
There's a hybrid approach: in DEBUG build, handle the error with an "Assertion failed" messagebox (usually this is done with ASSERT() macro), but in Release build, handle the error silently. This, however, lets the problem to go unnoticed on client's computers, often triggering other errors, which are hard to find.
Finally, about your worries that programmer can handle exception: it isn't something you should think about. You indicated a fatal error, if programmer ignores it, it's his fault.