phpbuilder - Error Handling
| From: | Ulf Wendel | Date: | Tue, 18 Jul 2000 21:13:42 +0000 |
| Subject: | phpbuilder - Error Handling | ||
| Groups: | php.pear | ||
| Request: | Send a blank email to php-pear+get-145@lists.php.net to get a copy of this message | ||
Hi all,
here some ideas on error handling based on what I have seen in the
phpbuilder article
http://www.phpbuilder.com/columns/sean20000712.php3?page=3.
I guess it
shown only a small subset of your ideas Stig, does it?
I like the idea of creating error objects very much and I played with it
in my last project. I adopted quite a lot of the java way. All error
classes are inherited from a common baseclass "exception".
instance variables:
$CLASSNAME - overriden, used to classify exceptions (IO, User, ...)
$ERROR_MESSAGE_PREFIX - overriden, some prefix added to the exception
$ERROR_PREPEND - some prepend and append for PHP3 users that do not
$ERROR_APPEND - have trigger_error() to customize the output
$message - error message itself
$file - Filename where the error occured
$line - Line number where the error occured, method name is
not neccessary as long as you have the line number
$DIE_ON_ERROR - for debugging purpose it should be there
$AUTO_PRINT_ERROR - same as $DIE_ON_ERROR
$LEVEL - error level used when trigger_error() gets called
$TRIGGER_ERROR - turns the call to trigger_error() on and off
I like having $DIE_ON_ERROR and $AUTO_PRINT_ERROR very much because it
makes debugging easy. Just turn it on an you'll see all messages. All
other variables are self explaining.
methods:
void constructor ( string $message, [string $file, int $line])
Sets some instance variables (message, file, line) and
calls trigger_error(), printLocalizedMessage() and die()
if necessary.
string getMessage( void )
Returns the current error message. Uses ERROR_PREPEND,
ERROR_MESSAGE_PREFIX, message and ERROR_APPEND to
build the message.
string getLocalizedMessage ( void )
Same as getMessage() plus line numbwe and filename.
string getType( void )
Returns the $CLASSNAME. The classname should
always start with "Exception" or maybe "Error"
followed by a descriptive name. The $CLASSNAME
allows you to distinguish beetween a valid
return type and an error...
What does a derived class MyPackageException" look like?
instance variables:
$CLASSNAME = "ExceptionMyPackage";
$ERROR_MESSAGE_PREPEND = "Error in my package: ";
$LEVEL = USER_ERROR;
[$ERROR_PREPEND]
[$ERROR_APPEND]
methods:
void constructor ( string $message [, string $file, int $line] )
Just calls the constructor of the base class.
How do I "throw" an error?
All my classes that might "throw" an error have a public instance
variables $err which holds the last exception object. Whenever an error
occurs the method saves the exception in $this->err and tries to return
some usefull value (false, empty array etc.) to preevent errors that
appear because an unexpected datatype gets returned. Anyway this is not
necessary for PEAR. Simply do: 'return MyPackageException("trouble
somewhere", __FILE__, __LINE__);'.
How do I "catch" an error?
$ok = DB::connect();
if ( is_object($ok) && "Exception" == substr(get_classname($ok), ??end
of beginning?? ) ) {
$msg = $ok->getLocalizedMessage();
# $ok->printLocalizedMessage();
}
Well, the sketched way is not perfect a real throw-catch construct would
be much better. Nevertheless it is a way you can handle exceptions quite
powerful and flexible in PHP3 and PHP4.
Stig are you planning to provide a set of default Exceptions? I would
like to see this ones:
IOException
FileNoPermissionException
FileNotFoundException
RuntimeException
NoSuchMethodException
InvalidParameterException
Ulf