Consider a business logic layer. Those are very often best served by making heavy use of assertion-oriented exceptions to simply halt processing when provided with information outside their acceptable bounds. This could be accomplished through return codes, but it turns out exceptions allow for succinct exit from the subsystem.