src/debug/ErrorHandler.php
public static function handleException(\Exception $exception) {
        $context = [];
        $second  = null;

        try {
            $context['class'    ] = __CLASS__;
            $context['file'     ] = $exception->getFile();  // If the location is not preset the logger will resolve the
            $context['line'     ] = $exception->getLine();  // exception handler as the originating location.
            $context['unhandled'] = true;

            Logger::log($exception, L_FATAL, $context);     // log with the highest level
        }

        // Exceptions thrown from within the exception handler will not be passed back to the handler again. Instead the
        // script terminates with an uncatchable fatal error.
        catch (\Exception $second) {
            $indent = ' ';                                  // the application is crashing, last try to log

            // secondary exception
            $msg2  = '[FATAL] Unhandled '.trim(DebugHelper::composeBetterMessage($second)).NL;
            $file  = $second->getFile();
            $line  = $second->getLine();
            $msg2 .= $indent.'in '.$file.' on line '.$line.NL.NL;
            $msg2 .= $indent.'Stacktrace:'.NL.$indent.'-----------'.NL;
            $msg2 .= DebugHelper::getBetterTraceAsString($second, $indent);

            // primary (the causing) exception
            if (isset($context['cliMessage'])) {
                $msg1 = $context['cliMessage'];
                if (isset($context['cliExtra']))
                    $msg1 .= $context['cliExtra'];
            }
            else {
                $msg1  = $indent.'Unhandled '.trim(DebugHelper::composeBetterMessage($exception)).NL;
                $file  = $exception->getFile();
                $line  = $exception->getLine();
                $msg1 .= $indent.'in '.$file.' on line '.$line.NL.NL;
                $msg1 .= $indent.'Stacktrace:'.NL.$indent.'-----------'.NL;
                $msg1 .= DebugHelper::getBetterTraceAsString($exception, $indent);
            }

            $msg  = $msg2.NL;
            $msg .= $indent.'caused by'.NL;
            $msg .= $msg1;
            $msg  = str_replace(chr(0), '?', $msg);         // replace NUL bytes which mess up the logfile

            if (CLI)                                        // full second exception
                echo $msg.NL;
            error_log(trim($msg), ERROR_LOG_DEFAULT);
        }

        // web: prevent an empty page
        if (!CLI) {
            try {
                if (Application::isAdminIP() || ini_get_bool('display_errors')) {
                    if ($second) {                          // full second exception, full log location
                        echoPre($second);
                        echoPre('error log: '.(strlen($errorLog=ini_get('error_log')) ? $errorLog : 'web server'));
                    }
                }
                else echoPre('application error (see error log)');
            }
            catch (\Exception $third) {
                echoPre('application error (see error log)');
            }
        }
    }
public static function handleException(\Exception $exception) {
        $context = [];
        $second  = null;

        try {
            $context['class'    ] = __CLASS__;
            $context['file'     ] = $exception->getFile();  // If the location is not preset the logger will resolve the
            $context['line'     ] = $exception->getLine();  // exception handler as the originating location.
            $context['unhandled'] = true;

            Logger::log($exception, L_FATAL, $context);     // log with the highest level
        }

        // Exceptions thrown from within the exception handler will not be passed back to the handler again. Instead the
        // script terminates with an uncatchable fatal error.
        catch (\Exception $second) {
            $indent = ' ';                                  // the application is crashing, last try to log

            // secondary exception
            $msg2  = '[FATAL] Unhandled '.trim(DebugHelper::composeBetterMessage($second)).NL;
            $file  = $second->getFile();
            $line  = $second->getLine();
            $msg2 .= $indent.'in '.$file.' on line '.$line.NL.NL;
            $msg2 .= $indent.'Stacktrace:'.NL.$indent.'-----------'.NL;
            $msg2 .= DebugHelper::getBetterTraceAsString($second, $indent);

            // primary (the causing) exception
            if (isset($context['cliMessage'])) {
                $msg1 = $context['cliMessage'];
                if (isset($context['cliExtra']))
                    $msg1 .= $context['cliExtra'];
            }
            else {
                $msg1  = $indent.'Unhandled '.trim(DebugHelper::composeBetterMessage($exception)).NL;
                $file  = $exception->getFile();
                $line  = $exception->getLine();
                $msg1 .= $indent.'in '.$file.' on line '.$line.NL.NL;
                $msg1 .= $indent.'Stacktrace:'.NL.$indent.'-----------'.NL;
                $msg1 .= DebugHelper::getBetterTraceAsString($exception, $indent);
            }

            $msg  = $msg2.NL;
            $msg .= $indent.'caused by'.NL;
            $msg .= $msg1;
            $msg  = str_replace(chr(0), '?', $msg);         // replace NUL bytes which mess up the logfile

            if (CLI)                                        // full second exception
                echo $msg.NL;
            error_log(trim($msg), ERROR_LOG_DEFAULT);
        }

        // web: prevent an empty page
        if (!CLI) {
            try {
                if (Application::isAdminIP() || ini_get_bool('display_errors')) {
                    if ($second) {                          // full second exception, full log location
                        echoPre($second);
                        echoPre('error log: '.(strlen($errorLog=ini_get('error_log')) ? $errorLog : 'web server'));
                    }
                }
                else echoPre('application error (see error log)');
            }
            catch (\Exception $third) {
                echoPre('application error (see error log)');
            }
        }
    }
public static function handleException ( \ Exception $ exception ) { $ context = [ ] ; $ second = null ; try { $ context [ 'class' ] = __CLASS__ ; $ context [ 'file' ] = $ exception -> getFile ( ) ; // If the location is not preset the logger will resolve the $ context [ 'line' ] = $ exception -> getLine ( ) ; // exception handler as the originating location. $ context [ 'unhandled' ] = true ; Logger :: log ( $ exception , L_FATAL , $ context ) ; // log with the highest level } // Exceptions thrown from within the exception handler will not be passed back to the handler again. Instead the // script terminates with an uncatchable fatal error. catch ( \ Exception $ second ) { $ indent = ' ' ; // the application is crashing, last try to log // secondary exception $ msg2 = '[FATAL] Unhandled ' . trim ( DebugHelper :: composeBetterMessage ( $ second ) ) . NL ; $ file = $ second -> getFile ( ) ; $ line = $ second -> getLine ( ) ; $ msg2 .= $ indent . 'in ' . $ file . ' on line ' . $ line . NL . NL ; $ msg2 .= $ indent . 'Stacktrace:' . NL . $ indent . '-----------' . NL ; $ msg2 .= DebugHelper :: getBetterTraceAsString ( $ second , $ indent ) ; // primary (the causing) exception if ( isset ( $ context [ 'cliMessage' ] ) ) { $ msg1 = $ context [ 'cliMessage' ] ; if ( isset ( $ context [ 'cliExtra' ] ) ) $ msg1 .= $ context [ 'cliExtra' ] ; } else { $ msg1 = $ indent . 'Unhandled ' . trim ( DebugHelper :: composeBetterMessage ( $ exception ) ) . NL ; $ file = $ exception -> getFile ( ) ; $ line = $ exception -> getLine ( ) ; $ msg1 .= $ indent . 'in ' . $ file . ' on line ' . $ line . NL . NL ; $ msg1 .= $ indent . 'Stacktrace:' . NL . $ indent . '-----------' . NL ; $ msg1 .= DebugHelper :: getBetterTraceAsString ( $ exception , $ indent ) ; } $ msg = $ msg2 . NL ; $ msg .= $ indent . 'caused by' . NL ; $ msg .= $ msg1 ; $ msg = str_replace ( chr ( 0 ) , '?' , $ msg ) ; // replace NUL bytes which mess up the logfile if ( CLI ) // full second exception echo $ msg . NL ; error_log ( trim ( $ msg ) , ERROR_LOG_DEFAULT ) ; } // web: prevent an empty page if ( ! CLI ) { try { if ( Application :: isAdminIP ( ) || ini_get_bool ( 'display_errors' ) ) { if ( $ second ) { // full second exception, full log location echoPre ( $ second ) ; echoPre ( 'error log: ' . ( strlen ( $ errorLog = ini_get ( 'error_log' ) ) ? $ errorLog : 'web server' ) ) ; } } else echoPre ( 'application error (see error log)' ) ; } catch ( \ Exception $ third ) { echoPre ( 'application error (see error log)' ) ; } } }
Global handler for otherwise unhandled exceptions.

The exception is sent to the default logger with loglevel L_FATAL. After the handler returns PHP will terminate
the script.

@param  \Exception $exception - the unhandled exception
Global handler for otherwise unhandled exceptions .