Exceptions break the normal flow of control (by propagating outward), and should therefore be used when you want to break flow. When you don't want to, use a return value. It's common to see either approach being abused, but it's rarely a deal-breaker.