Custom error handler for PHP

Posted on

Problem

I’ve written a custom Error handler for use in PHP. What it does is simply capture PHP errors, and logs them using Monolog.

It works, but I can’t help that it has too much stuff inside. I could remove the error levels that are not handled by set_error_handler but that’s guaranteed to lead to a developer that spends 2 hours wondering “why E_ERRORs are not getting logged”…

Could this function be improved somehow?

set_error_handler(function($errno ,$errstr,$errfile ,$errline, $errcontext) {
    // When we use the error supressing operator (@) 
    // error_reporting is temporarily set to 0
    // Do not log anything for that case
    if(ini_get('error_reporting')==0){return;}


    $halt = FALSE;
    // http://php.net/manual/en/errorfunc.constants.php
    switch($errno){
        case E_USER_ERROR:
        case E_RECOVERABLE_ERROR:
            $halt = true;
            $logType = 'error';
            break;

        case E_WARNING:
        case E_USER_WARNING:
        case E_STRICT:
        case E_DEPRECATED:
            $logType = 'warning';
            break;

        case E_NOTICE:
        case E_USER_NOTICE:
            $logType = 'notice';
            break;

            // The following error types cannot be caught by set_error_handler
            // Adding them for reference only
        case E_CORE_WARNING:
        case E_COMPILE_ERROR:
        case E_COMPILE_WARNING:
        case E_CORE_ERROR:
        case E_ERROR:
        case E_PARSE:
            return FALSE;

        // We should never reach this case. But you never know
        case E_ALL:
        default:
            $logType = 'warning';
    }
    Logger::{$logType}($errstr, $errcontext);
    // Halt the execution for errors that should halt
    if($halt)
        exit($errno);
});

Solution

Look here it is already tested on live projects error catcher.

Fatal errors can be catch only by ‘register_shutdown_function’

You do not track uncatched Exceptions, it can be done by ‘set_exception_handler’

If code runout all memory it will not able to log error, but if you does not catch Fatal errors so it is not your case.

Leave a Reply

Your email address will not be published. Required fields are marked *