Php get all exceptions

PHP Exception Handling

Exceptions are used to change the normal flow of a script if a specified error occurs.

What is an Exception

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:

  • The current code state is saved
  • The code execution will switch to a predefined (custom) exception handler function
  • Depending on the situation, the handler may then resume the execution from the saved code state, terminate the script execution or continue the script from a different location in the code

We will show different error handling methods:

  • Basic use of Exceptions
  • Creating a custom exception handler
  • Multiple exceptions
  • Re-throwing an exception
  • Setting a top level exception handler

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.

Читайте также:  Php datetime year month

Basic Use of Exceptions

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:

//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);
?>

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 thrown in C:\webfolder\test.php on line 6

Try, throw and catch

To avoid the error from the example above, we need to create the proper code to handle an exception.

Proper exception code should include:

  1. try — A function using an exception should be in a «try» block. If the exception does not trigger, the code will continue as normal. However if the exception triggers, an exception is «thrown»
  2. throw — This is how you trigger an exception. Each «throw» must have at least one «catch»
  3. catch — A «catch» block retrieves an exception and creates an object containing the exception information

Lets try to trigger an exception with valid code:

//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();
>
?>

The code above will get an error like this:

Example explained:

The code above throws an exception and catches it:

  1. The checkNum() function is created. It checks if a number is greater than 1. If it is, an exception is thrown
  2. The checkNum() function is called in a «try» block
  3. The exception within the checkNum() function is thrown
  4. The «catch» block retrieves the exception and creates an object ($e) containing the exception information
  5. The error message from the exception is echoed by calling $e->getMessage() from the exception object

However, one way to get around the «every throw must have a catch» rule is to set a top level exception handler to handle errors that slip through.

Creating a Custom Exception Class

To create a custom exception handler you must 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:

class customException extends Exception public function errorMessage() //error message
$errorMsg = ‘Error on line ‘.$this->getLine().’ in ‘.$this->getFile()
.’: ‘.$this->getMessage().’ 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:

  1. 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
  2. The errorMessage() function is created. This function returns an error message if an e-mail address is invalid
  3. The $email variable is set to a string that is not a valid e-mail address
  4. The «try» block is executed and an exception is thrown since the e-mail address is invalid
  5. The «catch» block catches the exception and displays the error message

Multiple Exceptions

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:

class customException extends Exception public function errorMessage() //error message
$errorMsg = ‘Error on line ‘.$this->getLine().’ in ‘.$this->getFile()
.’: ‘.$this->getMessage().’ is not a valid E-Mail address’;
return $errorMsg;
>
>

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:

  1. 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
  2. The errorMessage() function is created. This function returns an error message if an e-mail address is invalid
  3. The $email variable is set to a string that is a valid e-mail address, but contains the string «example»
  4. The «try» block is executed and an exception is not thrown on the first condition
  5. The second condition triggers an exception since the e-mail contains the string «example»
  6. The «catch» block catches the exception and displays the correct error message

If the exception thrown were of the class customException and there were 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 are of no interest to the user. To make things easier for the user you can re-throw the exception with a user friendly message:

class customException extends Exception public function errorMessage() //error message
$errorMsg = $this->getMessage().’ is not a valid E-Mail address.’;
return $errorMsg;
>
>

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:

  1. 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
  2. The errorMessage() function is created. This function returns an error message if an e-mail address is invalid
  3. The $email variable is set to a string that is a valid e-mail address, but contains the string «example»
  4. The «try» block contains another «try» block to make it possible to re-throw the exception
  5. The exception is triggered since the e-mail contains the string «example»
  6. The «catch» block catches the exception and re-throws a «customException»
  7. The «customException» is caught and displays an error message

If the exception is not caught in its 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:

function myException($exception) echo «Exception: » . $exception->getMessage();
>

throw new Exception(‘Uncaught Exception occurred’);
?>

The output of the code above should be something like this:

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.

Rules for exceptions

  • Code may be surrounded in a try block, to help catch potential exceptions
  • Each try block or «throw» must have at least one corresponding catch block
  • Multiple catch blocks can be used to catch different classes of exceptions
  • Exceptions can be thrown (or re-thrown) in a catch block within a try block

A simple rule: If you throw something, you have to catch it.

Источник

php — Get all the exceptions from one try catch block

Solution:

You wrote it yourself: «This will never get throwed» [sic].

Because the exception will never get thrown, you cannot catch it. There only is one exception because after one exception is thrown, the whole block is abandoned and no further code in it is executed. Hence no second exception.

Answer

Solution:

Maybe this was what the OP was actually asking for. If the function is not atomic and allows for some level of fault tolerance, then you can know all the errors that occurred afterwards instead of die() ing if you do something like this:

public function test() < $arrayExceptions = array(); try < //action 1 throws an exception, as simulated below throw new Exception('Division by zero.'); >catch (Exception $e) < //handle action 1 's error using a default or fallback value $arrayExceptions[] = $e; >try < //action 2 throws another exception, as simulated below throw new Exception('Value is not 42!'); >catch (Exception $e) < //handle action 2 's error using a default or fallback value $arrayExceptions[] = $e; >echo 'Task ended. Errors: '; // all the occurred exceptions are in the array (count($arrayExceptions)!=0) ? print_r($arrayExceptions) : echo 'no error.'; > 

Share solution ↓

Additional Information:

Didn’t find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Similar questions

Find the answer in similar questions on our website.

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

About the technologies asked in this question

PHP

PHP (from the English Hypertext Preprocessor — hypertext preprocessor) is a scripting programming language for developing web applications. Supported by most hosting providers, it is one of the most popular tools for creating dynamic websites. The PHP scripting language has gained wide popularity due to its processing speed, simplicity, cross-platform, functionality and distribution of source codes under its own license.
https://www.php.net/

Welcome to programmierfrage.com

programmierfrage.com is a question and answer site for professional web developers, programming enthusiasts and website builders. Site created and operated by the community. Together with you, we create a free library of detailed answers to any question on programming, web development, website creation and website administration.

Get answers to specific questions

Ask about the real problem you are facing. Describe in detail what you are doing and what you want to achieve.

Help Others Solve Their Issues

Our goal is to create a strong community in which everyone will support each other. If you find a question and know the answer to it, help others with your knowledge.

Источник

Оцените статью