1

I have custom error handlers on my production computer:

register_shutdown_function( "check_for_fatal" );
set_error_handler('errHandle');
set_exception_handler( "log_exception" );

All errors are sent to mail. But format is horrible (straight line text).

Does anybody know any library, function, owns any code, that would format error in html with as many details as possible. (message, file, line, errorclass, complete callstack, perhaps global variables - $_GET, $_POST, ...) As much information as possible, so I will have easier job fixing issues.

Makla
  • 7,975
  • 9
  • 52
  • 118

2 Answers2

0
<?php
    // Defining the handlers.
    register_shutdown_function( 'FatalErrorHandler' );
    set_error_handler(          'ErrorHandler'      );

    function ErrorHandler( $iNumber, $sMessage, $sFile, $sLine, array $aContext )
    {
        $aLastError = error_get_last();

        // If we have a fatal error let the fatal handler take care of it.
        // Required otherwise dual logs will occur as both handlers are called.
        if ( $aLastError === NULL )
        {

            $aError = array();
            $aError[ 'error' ][ 'code'    ] = $iNumber;
            $aError[ 'error' ][ 'msg'     ] = $sMessage;
            $aError[ 'error' ][ 'file'    ] = $sFile;
            $aError[ 'error' ][ 'line'    ] = $sLine;
            $aError[ 'error' ][ 'context' ] = $aContext;

            // Remove output.
            ob_clean();

            $sOutputMsg = 'Error \'' . $iNumber . '\' occurred in ' . $sFile .
                ' on line ' . $sLine . ' Message: ' . $sMessage;

            $sTrace = '';
            $aTrace = debug_backtrace();
            $iCountTraces = count( $aTrace );
            for( $i = 0; $i < $iCountTraces; ++$i )
            {

                $sTrace .= '<h3>Trace '
                    . $i
                    . '</h3><div><pre>'
                    . print_r( $aTrace[ $i ], true )
                    . '</pre></div>';
            }
            $sFullMessage = '<div id="top">'
                . $sOutputMsg
                . '<br />Error: '
                . $iNumber
                . '<br />File: '
                . $sFile
                . '<br />Line: '
                . $sLine
                . '<br />'
                . $sMessage
                . '<br/ ></div><div id="trace">Context: <pre>'
                . print_r( $aContext, true )
                . '</pre><br / >Stacktrace: '
                . '<br />'
                . $sTrace;
            var_dump( $sFullMessage );
            // Log( $sFullMessage );
        }
    }

    function FatalErrorHandler()
    {
        $aLastError = error_get_last();

        // Ensure this is a fatal error otherwise let errorhandler handle it.
        if ( ( $aLastError[ 'type' ] === E_ERROR ) || ( $aLastError[ 'type' ] === E_USER_ERROR ) )
        {
            // Remove output.
            ob_clean();

            // Ensure we had data inside error get last.
            $sType = empty( $aLastError[ 'type' ] ) ? '' : $aLastError[ 'type' ];
            $sFile = empty( $aLastError[ 'file' ] ) ? '' : $aLastError[ 'file' ];
            $sLine = empty( $aLastError[ 'line' ] ) ? '' : $aLastError[ 'line' ];
            $sMsg  = empty( $aLastError[ 'msg' ]  ) ? '' : $aLastError[ 'msg' ];

            $sFullMessage = 'Fatal Error \''
                . $sType
                . '\' occurred in '
                . $sFile
                . ' on line '
                . $sLine
                . '<br />Message: '
                . $sMsg;

            // Fatal errors don't have a stacktrace.
            var_dump( $sFullMessage );
            // Log( $sFullMessage );
        }
    }
    // Examples:

    // Fatal error throw
    $oTmp = NULL;
    $oTmp->hey();

    // Error throw
    // e
?>
Vladimir Ramik
  • 1,935
  • 2
  • 11
  • 23
0

I also make my own. Since I deal a lot with PDO, I also check if exception is PDO and add some details.

Output is not pretty, but it is meant for developer and nobody else.

static function FormatException($exception, $level = 0)
        {
            $result = "";
            $result = sprintf('<div style="padding-left:%dpx">', $level * 20);
            $result .= sprintf("<div><b>Message: </b> %s</div>", $exception->getMessage());
            $result .= sprintf("<div><b>Code: </b> %s</div>", $exception->getCode());
            $result .= sprintf("<div><b>File: </b> %s</div>", $exception->getFile());
            $result .= sprintf("<div><b>Line: </b> %s</div>", $exception->getLine());
            $result .= sprintf("<div><b>Trace: </b></div>");
            $result .= sprintf('<div style="padding-left: 20px;">');
            foreach ($exception->getTrace() as $trace)
            {
                $result .= sprintf('<div style="border: 1px solid #000;margin-top: 10px;">');
                $result .= sprintf("<div><b>File: </b> %s</div>", $trace['file']);
                $result .= sprintf("<div><b>Line: </b> %s</div>", $trace['line']);
                $result .= sprintf("<div><b>Function: </b> %s</div>", $trace['function']);
                $result .= sprintf("<div><b>Class: </b> %s</div>", $trace['class']);
                $result .= sprintf("<div><b>Type: </b> %s</div>", $trace['type']);
                $result .= sprintf("<div><b>Args: </b></div>");
                $result .= sprintf('<div style="padding-left: 20px;">');
                foreach ($trace['args'] as $arg)
                    $result .= sprintf("<div><b>Arg: </b>%s</div>", json_encode($arg));
                $result .= sprintf("</div>");
                $result .= sprintf("</div>");
            }
            $result .= sprintf("</div>");
            if (get_class($exception) === "PDOException")
            {
                $result .= sprintf("<br />");
                $result .= sprintf("<div><b>PDO: </b></div>");
                $result .= sprintf('<div style="padding-left: 20px;">');
                $result .= sprintf("<div><b>Code: </b> %s</div>", $exception->errorInfo[0]);
                $result .= sprintf("<div><b>Driver code: </b> %s</div>", $exception->errorInfo[1]);
                $result .= sprintf("<div><b>Message: </b> %s</div>", $exception->errorInfo[2]);
                $result .= sprintf("</div>");
            }

            $prev = $exception->getPrevious();
            if (isset($prev))
                $result .= self::FormatException($prev, $level++);
            $result .= sprintf("</div>");
            $result .= sprintf("<br />");

            return $result;
        }
Makla
  • 7,975
  • 9
  • 52
  • 118