Error handling built into the code is a fine way of creating thoroughly tested and fine tuned collection of spagettified bugs.
Up to the final pre-delivery stages, the code should have no exception handling at all. This way, when sh!t happens, you don't have the luxury of deciding "this sh!t is unimportant, I will deal with it later". Since every bug blocks your progress, you have no choice but to find a root cause of every failure and fix it.
Have somebody build a small circuit controlling a red beacon and a siren attached to the integration server and make it go off every time an automated unit test fails after a commit. Create an attitude where people are ashamed of setting off the integration failure alarm.
That is the only way of getting somewhere close to a bug-free code that I know of.