I can't tell if your claim is about agile methodologies or not, but in case it is:
The agile methodologies pick the requirements that are most solid and independent to implement first and only refine and implement the others later.
The hope is that the latter set of requirements will be easier to nail down by the time you need them. If they were to change between the start of the project and the time you needed them again, that change would not have cost you anything.
What they do not do is encourage you to make things overly generic in order to already capture future requirements.
So they do intend to reduce the cost of late changes, but not by spending more up-front.
There's a limit to how much error handling code makes sense.
If you want to handle every eventuality gracefully, your code will be much more complex because of all of the error handling paths. This will in turn increase the chance of introducing bugs caused by limited understanding of the code (most likely by others or by you a long time from now).
In my opinion there's a balance to be struck and I usually stop at the file or component boundary. If it comes from the outside, deal with it. Internally (e.g. static functions), use asserts to check if you messed up.
Oh, I guess you just write your code once and nobody will ever modify it?
Asserts should stay in there just in case you or anyone else decides to break any of the invariants in the future.
"Text processing has made it possible to right-justify any idea, even one which cannot be justified on any other grounds." -- J. Finnegan, USC.