Exceptions are used to change the normal flow of a script if a specified error occurs
With PHP 5 came a new object oriented way of dealing with errors.
Exception handling is used to change the normal flow of the code execution if a specified error (exceptional) condition occurs. This condition is called an exception.
This is what normally happens when an exception is triggered:
We will show different error handling methods:
Note: Exceptions should only be used with error conditions, and should not be used to jump to another place in the code at a specified point.
When an exception is thrown, the code following it will not be executed, and PHP will try to find the matching "catch" block.
If an exception is not caught, a fatal error will be issued with an "Uncaught Exception" message.
Lets try to throw an exception without catching it:
<?php //create function with an exception function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //trigger exception checkNum(2); ?> // O/P : The code above will get an error like this: Fatal error: Uncaught exception "Exception" with message "Value must be 1 or below" in C:\webfolder\test.php:6 Stack trace: #0 C:\webfolder\test.php(12): checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6
To avoid the error from the example above, we need to create the proper code to handle an exception.
Proper exception code should include:
Lets try to trigger an exception with valid code:
<?php //create function with an exception function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //trigger exception in a "try" block try { checkNum(2); //If the exception is thrown, this text will not be shown echo "If you see this, the number is 1 or below"; } //catch exception catch(Exception $e) { echo "Message: "" .$e->getMessage(); } ?> // O/P : The code above will get an error like this: Message: Value must be 1 or below
Example explained :
The code above throws an exception and catches it:
However, one way to get around the "every throw must have a catch" rule is to set a top level exception handler to errors that slip trough.
Creating a custom exception handler is quite simple. We simply create a special class with functions that can be called when an exception occurs in PHP. The class must be an extension of the exception class.
The custom exception class inherits the properties from PHP's exception class and you can add custom functions to it.
Lets create an exception class:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = "Error on line ".$this->getLine()." in ".$this->getFile() .": <b>".$this->getMessage()."</b> is not a valid E-Mail address"; return $errorMsg; } } $email = "someone@example...com"; try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
The new class is a copy of the old exception class with an addition of the errorMessage() function.
Since it is a copy of the old class, and it inherits the properties and methods from the old class, we can use the exception class methods like getLine() and getFile() and getMessage().
Example explained :
The code above throws an exception and catches it with a custom exception class:
The customException() class is created as an extension of the old exception class. This way it inherits all methods and properties from the old exception class
It is possible for a script to use multiple exceptions to check for multiple conditions.
It is possible to use several if..else blocks, a switch, or nest multiple exceptions. These exceptions can use different exception classes and return different error messages:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = "Error on line ".$this->getLine()." in ".$this->getFile() .": <b>".$this->getMessage()."</b> is not a valid E-Mail address"; return $errorMsg; } } $email = "someone@example.com"; try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid throw new customException($email); } //check for "example" in mail address if(strpos($email, "example") !== FALSE) { throw new Exception("$email is an example e-mail"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
Example explained :
The code above tests two conditions and throws an exception if any of the conditions are not met:
If there was no customException catch, only the base exception catch, the exception would be handled there
Re-throwing Exceptions :
Sometimes, when an exception is thrown, you may wish to handle it differently than the standard way. It is possible to throw an exception a second time within a "catch" block.
A script should hide system errors from users. System errors may be important for the coder, but is of no intrest to the user. To make things easier for the user you can re-throw the exception with a user friendly message:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = $this->getMessage()." is not a valid E-Mail address."; return $errorMsg; } } $email = "someone@example.com"; try { try { //check for "example" in mail address if(strpos($email, "example") !== FALSE) { //throw exception if email is not valid throw new Exception($email); } } catch(Exception $e) { //re-throw exception throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
Example explained :
The code above tests if the email-address contains the string "example" in it, if it does, the exception is re-thrown:
If the exception is not caught in it's current "try" block, it will search for a catch block on "higher levels".
Set a Top Level Exception Handler :
The set_exception_handler() function sets a user-defined function to handle all uncaught exceptions.
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler("myException"); throw new Exception("Uncaught Exception occurred"); ?> //O/P : The output of the code above should be something like this: Exception: Uncaught Exception occurred
In the code above there was no "catch" block. Instead, the top level exception handler triggered. This function should be used to catch uncaught exceptions.
A simple rule : If you throw something, you have to catch it.
All Rights Reserved. © 2024 BookOfNetwork