NYCPHP Meetup

[nycphp-talk] Exceptions vs User Errors

Dan Cech dcech at phpwerx.net
Fri Jun 24 09:33:11 EDT 2011


On 6/23/2011 11:04 PM, Gary Mort wrote:
> I'm confused on the difference in common PHP usage between when one
> should use an exception and when one should use an error.

I usually set up a custom error handler to report internal problems via 
a back-channel (email, http to a tracking server, etc), and use 
Exceptions or other error reporting methods (PEAR_Error, etc) for 
returning error information destined for the user.

A pseudo-code example:

function do_something()
{
   // do something in the database
   $result = db_query(<some sql>);

   // if the query fails
   if (!$result) {
     // report the technical details via back channel
     trigger_error(db_error_details());

     // return a descriptive error to the user
     throw new Exception('Couldn't do something, contact support');
   }

   // use $result to do something

   return true
}

Of course there are innumerable ways to skin a cat, but this approach 
has worked out ok for me, and it means that I get back-channel 
notifications for all errors (php notices, etc).

> Most of my confusion comes from the fact that the way both Exceptions
> and Errors are handled and generated in PHP has changed over the years,
> with each one being used at times incorrectly because the other did not
> have all the functionality needed for particular usages.
>
> So, to review what my understanding is as of PHP 5.3:
>
> When an error is generated in PHP, there are a number of pre-defined
> types of errors:
> http://www.php.net/manual/en/errorfunc.constants.php
>
> What are especially useful for programmers is differentiating between:
> Depreciated, Notice, Warning,&  Error.

Firstly, http://en.wikipedia.org/wiki/Deprecation

> As of PHP 5.3 all of the above error levels have both a PHP error level
> and a "user" error level.  An example of the difference between them
> could be that when running a program that utilizes a PHP framework, if
> at some point in the code there is a call to the split() function - the
> program will execute correctly, however a depreciated error will be
> generated and if such errors are logged, periodic review of logfiles
> will give programmers a heads up that they have to recode part of the
> program.   Wheras if that framework defines it's own internal functions,
> and one function is slated to be removed, good programming practice
> would be for the framework authors to generate a user_depreciated error
> notice - which can be used in the same manner to update code using that
> framework.
>
> When user errors are generated in PHP, the program may or may not abort
> when the error is generated.  It may or may not log the error message to
> a file or some other method.  All of this depends primarily on how the
> PHP instance is configured.

Yes, though by setting a custom error handler you can take control of 
almost all of the errors (those excluded are listed here 
http://us3.php.net/set_error_handler) and process them however you see fit.

> This makes user errors great for providing information about potential
> problems with the code when you are not sure whether or not the error
> should result in the program aborting or just noting a transitory problem.

Yes, except that it is a pretty blunt instrument.  You can either return 
to the program flow where it left off, or completely exit.

> Exceptions can do most of the things user errors are used for, but one
> thing they cannot do is continue executing from the point of the
> exception being thrown.  Once thrown, the block of code being executed
> is aborted and the path of coding goes to the exception handler
> instead.   This could be used to generate an error message of some sort,
> log a problem, etc.

Not entirely true, but the code needs to be aware and have provisions to 
catch the Exception, whereupon it can take whatever action is necessary.

> As an example, consider a web page where we have a common header, a
> common footer, and then the main section of the web page.  For a
> particular url, the data being displayed in the main section is
> restricted to authorized individuals.
>
> Error handling: the page can be completely generated by one function.
> First the header is sent, then the authorization for the main section is
> checked - if it fails, an error can be generated and an unauthorized
> message generated for display, if it succeeds the data can be generated
> - then the footer is sent.  The user of the application can decide that
> they want to do something different[lock the account, abort handling,
> call the cops] by creating their own error handler function and calling
> it before they call the third party code.

Typically you'd want to do at least the access checks before you output 
anything to the client.

> Exception handling: The code needs to be much more object oriented.  For
> the main body of code, you might have an object where you call a
> generate header, generate content, and generate footer method.  In the
> generate content method, you would have to have a try block around the
> authorization check and content generation, and if authorization fails
> throw an exception.  You would also need to catch the exception and in
> the exception handling generate the error message to display for the user.

If you want to duplicate the same behavior as a custom error handler you 
can implement a custom exception handler 
(http://php.net/set_exception_handler) and perform the same sort of 
logic as in a custom error handler, with the advantage that code can 
trap and handle its own exceptions, only unhandled exceptions will 
bubble up to your handler.

> Here it can be much harder to override the default manner in which the
> exception is handled and add your own method.

See above.

> So what I'm curious regarding is how are these 2 methods used in
> practice today, as opposed to theory.  Especially when considering the
> use of frameworks where you don't expect a single team of programmers to
> be writing all the code -but rather you are building on an existing
> framework which can generate it's own errors and exceptions.

To my way of thinking these 2 systems are complementary, and as outlined 
above typically use them side-by-side for different purposes: 
trigger_error & php-generated errors for development/debugging and 
exceptions or other error return mechanisms for communicating errors 
back to the calling code and eventually to the client.

Dan



More information about the talk mailing list