IMO if you find yourself returning a multi-valued result, to indicate errors or other exceptional conditions, and returning that value up the stack so that higher level functions can handle the exceptional conditions, then using try/catch may be a better solution. Exceptions are useful and can result in cleaner code, in spite of sometimes being misused.