From 03589e9f34b2720d9f0b3b049431c35e276401a3 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Thu, 17 Aug 2006 02:56:12 +0000 Subject: [PATCH] Moving error handling stuff into Loader and Functions --- Functions.php | 38 ++++++++++++ Loader.php | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) diff --git a/Functions.php b/Functions.php index a6f9b42..3128797 100644 --- a/Functions.php +++ b/Functions.php @@ -647,6 +647,44 @@ class BSFunctions } return $array; } + + // ################################################################### + /** + * Prepares a debug_backtrace() array for output to the browser by + * compressing the array into visible text. This still has value because + * debug_print_backtrace() can't return data + * + * @param array debug_backtrace() array + * + * @return array Formatted trace output + */ + public static function FormatDebugTrace($backtrace) + { + $trace = array(); + foreach ($backtrace AS $i => $step) + { + $args = ''; + $file = $step['file'] . ':' . $step['line']; + $funct = (isset($step['class']) ? $step['class'] . '::' . $step['function'] : $step['function']); + + if (isset($step['args']) AND is_array($step['args'])) + { + // we need to do this so we don't get "Array to string conversion" notices + foreach ($step['args'] AS $id => $arg) + { + if (is_array($arg)) + { + $step['args']["$id"] = 'Array'; + } + } + $args = implode(', ', $step['args']); + } + + $trace[] = "#$i $funct($args) called at [$file]"; + } + + return $trace; + } } /*=====================================================================*\ diff --git a/Loader.php b/Loader.php index 1f17959..242fa30 100644 --- a/Loader.php +++ b/Loader.php @@ -74,6 +74,7 @@ class BSLoader if (!self::$instance) { self::$instance = new BSLoader; + set_error_handler(array(self::$instance, '_error_handler')); } return self::$instance; } @@ -174,6 +175,174 @@ class BSLoader return new $class; } + + // ################################################################### + /** + * Prints an ISSO message + * + * @param string The title of the message + * @param string The content of the message + * @param integer Type of message to be printed + * @param bool Return the output? + * @param bool Show the debug stack? + * @param integer Message width + * + * @return mixed Output or null + */ + public static function Message($title, $message, $type, $return = false, $stack = true, $width = 500) + { + switch ($type) + { + // Message + case 1: + $prefix = 'Message'; + $color = '#669900'; + $font = '#000000'; + break; + + // Warning + case 2: + $prefix = 'Warning'; + $color = '#003399'; + $font = '#FFFFFF'; + break; + + case 3: + $prefix = 'Error'; + $color = '#990000'; + $font = '#EFEFEF'; + break; + } + + $backtrace = debug_backtrace(); + array_shift($backtrace); + + if (isset($backtrace[0]) AND $backtrace[0]['function'] == '_error_handler') + { + array_shift($backtrace); + } + + $trace = BSFunctions::FormatDebugTrace($backtrace); + + $output = "\n
\n"; + $output .= "\n\n\t\n"; + $output .= "\n\n\t\n"; + $output .= (($stack AND self::GetRegister()->getDebug()) ? "\n\n\t\n" : ''); + $output .= "\n
$prefix: $title
$message
Debug Stack:
" . implode("\n", $trace) . "
\n
\n"; + + if ($return) + { + return $output; + } + else + { + print($output); + } + } + + // ################################################################### + /** + * Custom error handler for ISSO; only handle E_WARNING, E_NOTICE, + * E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE + * + * @param integer Error number + * @param string Error message string + * @param string File that contains the error + * @param string The line number of the error + * @param string The active symbol table at which point the error occurred + */ + private function _error_handler($errno, $errstr, $errfile, $errline, $errcontext) + { + $level = ini_get('error_reporting'); + + switch ($errno) + { + // So we don't need to specify the error type in trigger_error(), all E_USER_NOTICEs + // are fatal and automatically kill the script + case E_USER_NOTICE: + $title = 'Fatal'; + $mode = 3; + break; + + // A non-fatal but important warning + case E_WARNING: + $title = 'Warning'; + $mode = 2; + if (!($level & E_WARNING)) + { + return; + } + break; + + // A non-fatal notice that should all but be ignored unless in dev environments + case E_NOTICE: + case E_STRICT: + $title = 'Notice'; + $mode = 1; + if (!($level & E_NOTICE)) + { + return; + } + break; + + case E_USER_WARNING: + case E_USER_NOTICE: + default: + trigger_error('The only error types supported are E_USER_NOTICE (fatal), E_WARNING, and E_NOTICE ' . $errno); + break; + } + + $errstr .= " in $errfile on line $errline"; + + $errstr = str_replace(array(getcwd(), dirname(getcwd())), '', $errstr); + + self::Message($title, $errstr, $mode); + + if ($errno == E_USER_NOTICE) + { + exit; + } + } + + // ################################################################### + /** + * Creates a table that explains the error reporting levels and their + * state + */ + public function explain_error_reporting() + { + $levels = array( + 'E_ERROR' => E_ERROR, + 'E_WARNING' => E_WARNING, + 'E_PARSE' => E_PARSE, + 'E_NOTICE' => E_NOTICE, + 'E_CORE_ERROR' => E_CORE_ERROR, + 'E_CORE_WARNING' => E_CORE_WARNING, + 'E_COMPILE_ERROR' => E_COMPILE_ERROR, + 'E_COMPILE_WARNING' => E_COMPILE_WARNING, + 'E_USER_ERROR' => E_USER_ERROR, + 'E_USER_WARNING' => E_USER_WARNING, + 'E_USER_NOTICE' => E_USER_NOTICE, + 'E_ALL' => E_ALL, + 'E_STRICT' => E_STRICT + ); + + $table = ''; + + foreach ($levels AS $name => $value) + { + $table .= ' + + + + '; + } + + $table .= ' +
' . $name . '' . (ini_get('error_reporting') & $value) . '
'; + + $this->message('Error Reporting', $table, 1); + } } /*=====================================================================*\ -- 2.22.5