At page 46, the author asserts that using exceptions is better than returning error codes from your functions.
I heavily disagree, as this will separate logic in at least 2 pieces, with the error being handled elsewhere. I do find it excusable for certain contexts, like I/O (ie have a function that reads from a file raise an exception, but that exception should not be bumped up the call stack more than one step).
The design principle is also weakened by the possibility of returning multiple values, or to return a struct/class that contains both data and error.
I wonder what is the consensus on this design issue is, more than 10 years later.