That old chestnut has arisen once again with some new ramblings from both sides.
My thoughts.. the biggest problems with using return codes instead of exceptions are:
1. You can easily forget to check the return code of a method, and merrilly continue disregarding it failed. You can't ignore an exception without a suitable catch block.
2. Handling failure is a whole lot more complex with return codes. This is basically what structured exception handling was invented to solve. People often used to solve this with nasty nested IF statements and even GOTOs.
3. Exceptions usually contain very descriptive information about the failure. A return code is usually a number, maybe an enumerator at best. A lot more work to figure out what's going on. Objects can contain a whole lot more.
Of course we shouldn't rely on exceptions for program flow.
We should also have validation methods that tell us whether the operation can succeed, and call these prior to the actual method. This should return true or false, or maybe even return an Exception-derived object instance to describe why it would fail. If you're not calling the validation routine, then you're not expecting it to fail validation, and that's when it should throw an exception.