I agree with kupferstecher, that the last thing you want your application to do after release, is crash. Because, at that moment, all bets are off and there is nothing more to be done.
From the start of programming, people have tried to make a programming language that allows you to check if your program is free of bugs. The problems with this approach are, that you cannot track (most) logical bugs, and that most applications aren't written in one go, by one programmer. Perhaps small ones, written in assembly, that run on simple microcontrollers, but even those tend to contain firmware, ie: third-party software over which you have no control.
If you want your application to crash if a mistake is made, you have to limit that to the internal state, which is mostly useless. Because programs process data, so part of the state machine is the validity of the input data. If you always assume that your inputs (parameters and data) are "valid", you will have a buggy program. It might work with your sanitized test-data, but as soon as it gets released, crap will go in.
So, the best way to handle it is programming defensively: never assume any state or value not controlled inside the function. And even then: if that's a class or uses an external library to create or execute functions, make sure you check the result. And if things go wrong, try to save whatever you can.
That's also why I don't like exceptions.