I believe that in properly coded systems - errors (as errors or exceptions) should not be possible (with the exception of a DB/memcached server going down causing a query to fail). Our code should not rely on any assumptions to properly work and should be as bullet proof as possible.
However, in order to insure that our systems handle problems in the most user friendly way, we have to build and implement some kind of "catching system" to insure that, should anything ever go wrong, both our server staff and the end user will be taken care of.
To this end PHP offers two solutions - errors and exceptions. Errors consist of 5 values while Exceptions consist of 5 values wrapped in an object. Both allow backtracks which are invaluable while the app is being built.
The 5 values are $error_code, $error_message, $file, $line, $context
Normally, in our strive for proper OOP programming the default choice is always to pursue objects - but in a case like this I'm not sure as to how beneficial they really are. By using exceptions, addition memory is wasted do to the need of wrapping the values in an object (this also often requires extra files which contain the exception classes). Further more, you must wrap any code that you assume might fail in a TRY / CATCH {} block. This leaves the error handling method open to human error as points of failure may not be covered by the developer. In order to safe guard against this you can use the set_exception_handler which will be passed any exceptions not caught. The bad thing about the exception handler is that Execution will stop after the exception_handler is called - so there is no such thing as a recoverable/ignored exception should it not be caught in a try / catch block.
On the other hand, errors are always global and can be handled by any function/class set by the set_error_handler. This removes the need for extra exception classes, object memory, or lines of try / catch code. Like exceptions, errors also come with build in error codes which (unlike exceptions) you can use to continue script execution for minor or unimportant script problems. In addition, most of the PHP functions triggers errors so you will not be going against the flow of the language.
So given that you must support error handling anyway (do to the PHP language), what is the purpose of wasting extra code and memory also implementing exceptions? Are we just blindly doing this because it is an error in object form or is there a real benefit in application design that normal errors don't afford us?