Fatal Error Customization

Everyone surely has already encountered it: A fatal error on a page that is online including the white page you get to see because of it. There’s a nice and easy way of showing an error page instead of a white page if a Fatal Error occurs by using output buffering. According to its documentation, ob_start() supports a callback as first parameter. The cool thing is that this callback is also called in case of a Fatal Error!

Here’s how it works:

class Redirector
{
    public static function redirectOnError($buffer)
    {
        $lastError = error_get_last();
        if(!is_null($lastError) && $lastError[‘type’] === E_ERROR) {
            header(‘HTTP/1.1 302 Moved Temporarily’);
            header(‘Status: 302 Moved Temporarily’);
            header(‘Location: error.php’);
            exit();
        }
        return $buffer;
    }
}

ob_start(array(‘Redirector’, ‘redirectOnError’));
print(‘Hello’);

foobar();

ob_end_flush();
The callback is called in the moment the content is flushed, that’s why the flush should always be the last line in your output script if you wanna catch all Fatal errors. Since the callback is always executed, I added a check whether a fatal error occured, since we don’t want a redirect when no error occurs. Also keep in mind that the callback has to return the buffered output (that is already passed to the callback as a parameter) which will be printed after its execution. (Note that error_get_last() is PHP >= 5.2.0)

Note: Instead of an 302 redirect, which I used in the example, you could also just output an error message on the same page:

public static function redirectOnError($buffer)
{
    $lastError = error_get_last();
    if(!is_null($lastError) && $lastError[‘type’] === E_ERROR) {
        header(‘HTTP/1.1 503 Service Temporarily Unavailable’);
        header(‘Status: 503 Service Temporarily Unavailable’);
        $buffer = ‘Sorry, an error occured’;
    }
    return $buffer;
}

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: