Exceptions are clearly superior to error codes in most cases. Easier to maintain, easier to handle, and you can attach much more contextual information to them.
Shameless plug for my open source PHP error handler: https://github.com/slashtrace/slashtrace. I use it as a catch-all mechanism that displays detailed information about the error when running in a development environment, but sends the data to an external service (Sentry in my case) when in production.
Obviously there are a ton of places in the code where you want to catch and handle exceptions yourself, but having a catch-all acts as a safety net.
I do like their approach of logging stats for exceptions that don't represent system errors, but which they monitor anyway (like the BadClientRequestException).
Shameless plug for my open source PHP error handler: https://github.com/slashtrace/slashtrace. I use it as a catch-all mechanism that displays detailed information about the error when running in a development environment, but sends the data to an external service (Sentry in my case) when in production.
Obviously there are a ton of places in the code where you want to catch and handle exceptions yourself, but having a catch-all acts as a safety net.
I do like their approach of logging stats for exceptions that don't represent system errors, but which they monitor anyway (like the BadClientRequestException).