If you have pretty 'linear' code, exceptions might be a good solution to lessen the quantity of error handling code. Maybe when making a library that is the case... Still for most real programming out there, it is about reusing diverse components, lots of interrelationship between you code.
From experience, when trying to use lots of decoupled parts which call up each other without a previous knowledge of the paths, you will have to catch exception as close as possible to the problem.
This makes it worst than using simple return statements for errors....
