I'm a big fan of writting tests after a program (or function) is written to test the functionality of that function and tie it into the make test product, I work with a team of people an no one "owns" the code, the tests are there so that if someone modifies the code and my tests still pass, it is likely they haven't broken anything important. You can never catch everything with tests (the tests you forgot to write probably would have checked the exception you forgot to handle in your code) but at least when you come across an exception you can write a test for it, so that future versions of your software will never again fail due to that exception.