Summary: in this tutorial, you will learn how to set an exception handler using the PHP set_exception_handler()
function.
Introduction to the PHP set_exception_handler function
In practice, it’s very difficult to catch every possible exception. If an exception is uncaught, you’ll see the exception message on the page.
PHP allows you to catch the uncaught exceptions by registering a global exception handler.
The global exception handler allows you to show a user-friendly message to the users while logging the important information into a log file for troubleshooting later.
To register a global exception handler, you use the set_exception_handler()
function.
The set_exception_handler()
function accepts a callable where you can place the code to handle the uncaught exceptions. For example:
<?php
set_exception_handler(function ($ex) {
// handle the uncaught exception
});
Code language: HTML, XML (xml)
To use a global function, you can pass the function name to the set_exception_handler()
function like this:
<?php
set_exception_handler('handle_exceptions');
Code language: HTML, XML (xml)
In case you want to use a method of an object, you need to pass an array with the first element is the object and the second element is the method name. For example:
class ExceptionHandler
{
public function handle(Exception $ex)
{
// code to handle the exception
}
}
$handler = new ExceptionHandler();
set_exception_handler([$handler, 'handle']);
Code language: PHP (php)
Note that method of the object must be public to be used an exception handler.
Similary, you can use a public static method of a class as the exception handler:
<?php
class ExceptionHandler
{
public static function handle(Exception $ex)
{
// code to handle the exception
// ...
}
}
set_exception_handler(['ExceptionHandler', 'handle']);
Code language: HTML, XML (xml)
PHP set_exception_handler example
First, create the following directory structure with the corresponding files like this:
.
├── bootstrap.php
├── index.php
└── logs
└── errors.log
Code language: plaintext (plaintext)
Filename | Directory | Description |
---|---|---|
bootstrap.php | . | contains the code for bootstrapping the application |
index.php | . | is the entry page of the application |
errors.log | logs | contains the logging information |
Second, add the following code to the bootstrap.php
file:
<?php
set_exception_handler(function (Exception $ex) {
// set default timezone
date_default_timezone_set('America/Los_Angeles');
// get the current date & time
$time = date('F j, Y, g:i a e O');
// format the exception message
$message = "[{$time}] {$ex->getMessage()}\n";
// append to the error log
error_log($message, 3, 'logs/errors.log');
// show a user-friendly message
echo 'Whoops, looks like something went wrong!';
});
Code language: HTML, XML (xml)
In the bootstrap.php
file, we set the default time zone to 'America/Los_Angeles'
, get the current date and time, format the exception message, and log it into the errors.log
file located in the logs
directory.
The second argument (3
) of the error_log()
function indicates that it will append the log entry in the errors.log
file.
Third, place the following code in the index.php
file:
<?php
require 'bootstrap.php';
function add($a, $b)
{
if (!is_numeric($a) || !is_numeric($a)) {
throw new InvalidArgumentException('Both arguments must be numeric or numeric strings');
}
return $a + $b;
}
echo add('Hi', 'there');
Code language: HTML, XML (xml)
The index.php
includes the bootstrap.php
file. And it defines a function called add()
that returns the sum of two numbers.
However, the function call add('Hi', 'there')
uses string arguments instead of numbers. Therefore, it’ll throw an exception InvalidArgumentException
.
Since this exception is not caught in the index.php
, the global exception handler will catch it. The index.php
will show the following message:
Whoops, looks like something went wrong!
Code language: plaintext (plaintext)
If you look at the errors.log
file, you’ll find something like:
[April 10, 2021, 8:35 pm America/Los_Angeles -0700] File: ...\index.php, Line: 8, Message: Both arguments must be numeric or numeric strings
Code language: plaintext (plaintext)
Summary
- Use the
set_exception_handler()
function to register a global exception handler that handles uncaught exceptions.