Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

error.inc.php

Go to the documentation of this file.
00001 <?php
00002 define('ERROR_HANDLER_ROOT', dirname(__FILE__));
00003 
00008 class ErrorHandler
00009 {
00010     //what types of errors?
00011     public static $errType = array(
00012         1    => "Php Error",
00013         2    => "Php Warning",
00014         4    => "Parsing Error",
00015         8    => "Php Notice",
00016         16   => "Core Error",
00017         32   => "Core Warning",
00018         64   => "Compile Error",
00019         128  => "Compile Warning",
00020         256  => "Php User Error",
00021         512  => "Php User Warning",
00022         1024 => "Php User Notice"
00023     );
00024 
00033     public static function raiseError($errNo, $errMsg, $file, $line)
00034     {
00035         global $me;
00036         
00037         //if we ignore errors.. bounce
00038         if (!($errNo & error_reporting())) 
00039             return;
00040 
00041         //clear our buggers
00042         while (ob_get_level())
00043             ob_end_clean();
00044         
00045         //its its a user error... unserialize it.
00046         $info = array();
00047         if (($errNo & E_USER_ERROR) && is_array($arr = @unserialize($errMsg))) 
00048             foreach ($arr as $k => $v) 
00049                 $info[$k] = $v;
00050         else
00051             $info = $errMsg . " on line <b>$line</b>";
00052         
00053         //can we get a backtrace?
00054         $trace = array();
00055         if (function_exists('debug_backtrace'))
00056         {
00057             $trace = debug_backtrace();
00058             array_shift($trace);
00059         }
00060 
00061         //what shoudl we do?
00062         if ($me instanceOf User && $me->isAdmin())
00063             echo self::getBacktrace($info, $trace, $errNo);
00064         else
00065             echo self::getReportErrorForm($info, $trace, $errNo);
00066 
00067         exit;
00068     }
00069 
00070     public static function handleException($e)
00071     {
00072         global $me;
00073 
00074         //get our information
00075         $info = $e->getMessage();
00076         $trace = $e->getTrace();
00077         $errNo = $e->getCode();
00078 
00079         //what shoudl we do?
00080         if (($me instanceOf User && $me->isAdmin()) || !($me instanceOf User))
00081         {
00082             echo "<h3>Uncaught Exception: " . get_class($e) . "</h3>\n\n";
00083             echo self::getBacktrace($info, $trace, $errNo);
00084         }
00085         else
00086             echo self::getReportErrorForm($info, $trace, $errNo);
00087         
00088         exit;
00089     }
00090 
00091     public static function getBacktrace($info, $trace, $errNo = null)
00092     {
00093         //init our string.
00094         $s = '';
00095         
00096         if ($errNo)
00097             $s .= "<b>Error type:</b> " . self::$errType[$errNo] . "<br/>\n";
00098 
00099         $c['default'] = '#000000';
00100         $c['keyword'] = '#0000A0';
00101         $c['number']  = '#800080';
00102         $c['string']  = '#404040';
00103         $c['comment'] = '#808080';
00104 
00105         if (is_array($info) && count($info))
00106             foreach ($info as $k => $v)
00107                 $s .= "<b>$k:</b> $v<br/>\n";
00108         else if ($info)
00109             $s .= "<b>Message:</b> $info<br/>\n";
00110 
00111         //did we get a trace?
00112         if (count($trace))
00113         {
00114             $s .= "<b>Trace:</b>\n";
00115             $s .= "<ol>\n";
00116             $currentParam = -1;
00117             
00118             //show all our trace.
00119             foreach ($trace as $k => $v) 
00120             {
00121                 $currentParam++;
00122                 
00123                 $s .= "\t<li>";
00124                 
00125                 //was there a class?
00126                 if (isset($v['class'])) 
00127                 {
00128                     $s .= $v['class'];
00129                     $s .= ".";
00130                 } 
00131                 
00132                 //show the function.
00133                 $s .= $v['function'];
00134                 $s .= " (";
00135             
00136                 //and its args...
00137                 $sep = '';
00138                 $v['args'] = (array) @$v['args'];
00139                 foreach ($v['args'] as $arg)
00140                 {
00141                     $currentParam++;
00142                     
00143                     $s .= $sep;
00144                     $sep    = ', ';
00145                     $color = '#404040';
00146 
00147                     switch (true) 
00148                     {
00149                         case is_bool($arg):
00150                             $type = 'bool';
00151                             if ($arg)
00152                                 $param  = 'true';
00153                             else
00154                                 $param = 'false';
00155                             break;
00156 
00157                         case is_int($arg):
00158                         case is_float($arg):
00159                             $type = 'number';
00160                             $param  = $arg;
00161                             break;
00162 
00163                         case is_null($arg):
00164                             $param = 'null';
00165                             $type = $param;
00166                             break;
00167 
00168                         case is_string($arg):
00169                             $type = 'string[' . strlen($arg) . ']';
00170                             $param = $arg;
00171                             break;
00172 
00173                         case is_array($arg):
00174                             $type = 'array[' . count($arg) . ']';
00175                             ob_start();
00176                             print_r($arg);
00177                             $param = ob_get_contents();
00178                             ob_end_clean();
00179                             break;
00180 
00181                         case is_object($arg):
00182                             $type = 'object';
00183                             $param = get_class($arg);
00184                             break;
00185 
00186                         case is_resource($arg):
00187                             $type = 'resource';
00188                             $param = get_resource_type($arg);
00189                             break;
00190 
00191                         default:
00192                             $param = 'unknown';
00193                             $type = $param;
00194                             break;
00195                     }
00196 
00197                     $s .= "<span style=\"color: $color;\">";
00198                     $s .= $type . ": " . $param;
00199                     $s .= '</span>';
00200                 }
00201                 
00202                 $s .= ")";
00203                 $s .= "<br/>\n";
00204 
00205                 //now show the file.
00206                 if (!isset($v['file'])) 
00207                     $v['file'] = 'unknown';
00208                 if (!isset($v['line']))
00209                     $v['line'] = 'unknown';
00210 
00211                 //where?
00212                 $v['line'] = @$v['line'];
00213                 $s .= "\t<b>Location:</b> $v[file] (Line: $v[line])";
00214                 
00215                 $s .= "</li>\n";
00216             }
00217             
00218             $s .= "</ol>\n";
00219         }
00220         else
00221             $s .= "Could not get backtrace!\n";
00222 
00223         return $s;
00224     }
00225 
00226     public static function getReportErrorForm($info, $trace, $errNo = null)
00227     {
00228         //do we have a main class?
00229         if (class_exists('Main'))
00230         {
00231             //draw our form!
00232             $main = new Main();
00233         
00234             $backtrace = base64_encode(self::getBacktrace($info, $trace, $errNo));
00235             $form = $main->createErrorForm($backtrace); 
00236             $form->drawAll();
00237         }
00238         //nope, draw our error text.
00239         else
00240             echo "There was an error. Please contact " .
00241             Linkify::email(Config::get('site_admin')) . " and let them know you have a
00242             problem.  Please include information like what you were doing, what
00243             page you were on, etc.";
00244     }
00245 }
00246 
00247 //create our error handler and make it the object..
00248 $__ErrorHandler = new ErrorHandler;
00249 set_error_handler(array(&$__ErrorHandler, 'raiseError'));
00250 ?>

Generated on Fri Oct 27 12:26:39 2006 for BaseJumper by doxygen 1.3.9.1