00001 <?php
00002 define('ERROR_HANDLER_ROOT', dirname(__FILE__));
00003
00008 class ErrorHandler
00009 {
00010
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
00038 if (!($errNo & error_reporting()))
00039 return;
00040
00041
00042 while (ob_get_level())
00043 ob_end_clean();
00044
00045
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
00054 $trace = array();
00055 if (function_exists('debug_backtrace'))
00056 {
00057 $trace = debug_backtrace();
00058 array_shift($trace);
00059 }
00060
00061
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
00075 $info = $e->getMessage();
00076 $trace = $e->getTrace();
00077 $errNo = $e->getCode();
00078
00079
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
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
00112 if (count($trace))
00113 {
00114 $s .= "<b>Trace:</b>\n";
00115 $s .= "<ol>\n";
00116 $currentParam = -1;
00117
00118
00119 foreach ($trace as $k => $v)
00120 {
00121 $currentParam++;
00122
00123 $s .= "\t<li>";
00124
00125
00126 if (isset($v['class']))
00127 {
00128 $s .= $v['class'];
00129 $s .= ".";
00130 }
00131
00132
00133 $s .= $v['function'];
00134 $s .= " (";
00135
00136
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
00206 if (!isset($v['file']))
00207 $v['file'] = 'unknown';
00208 if (!isset($v['line']))
00209 $v['line'] = 'unknown';
00210
00211
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
00229 if (class_exists('Main'))
00230 {
00231
00232 $main = new Main();
00233
00234 $backtrace = base64_encode(self::getBacktrace($info, $trace, $errNo));
00235 $form = $main->createErrorForm($backtrace);
00236 $form->drawAll();
00237 }
00238
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
00248 $__ErrorHandler = new ErrorHandler;
00249 set_error_handler(array(&$__ErrorHandler, 'raiseError'));
00250 ?>