103 private static $_observers = array();
104 private static $_uniqueid = 0;
126 } elseif (is_object($p2) || is_array($p2)) {
128 if (is_object($p2) && !($p2 instanceof Exception)) {
129 if (!class_exists(
'PEAR_Error') || !($p2 instanceof
PEAR_Error)) {
131 'array, or PEAR_Error');
135 if (is_array($p2) && isset($p2[
'message'])) {
144 parent::__construct($message, $code);
158 self::$_observers[$label] = $callback;
163 unset(self::$_observers[$label]);
171 return self::$_uniqueid++;
174 private function signal()
176 foreach (self::$_observers as $func) {
177 if (is_callable($func)) {
178 call_user_func($func, $this);
181 settype($func,
'array');
183 case self::OBSERVER_PRINT :
184 $f = (isset($func[1])) ? $func[1] :
'%s';
185 printf($f, $this->getMessage());
187 case self::OBSERVER_TRIGGER :
188 $f = (isset($func[1])) ? $func[1] : E_USER_NOTICE;
189 trigger_error($this->getMessage(), $f);
191 case self::OBSERVER_DIE :
192 $f = (isset($func[1])) ? $func[1] :
'%s';
193 die(printf($f, $this->getMessage()));
196 trigger_error(
'invalid observer type', E_USER_WARNING);
237 $cause = array(
'class' => get_class($this),
240 'line' =>
'unknown');
241 if (isset($trace[0])) {
242 if (isset($trace[0][
'file'])) {
243 $cause[
'file'] = $trace[0][
'file'];
244 $cause[
'line'] = $trace[0][
'line'];
249 $this->cause->getCauseMessage($causes);
250 } elseif ($this->cause instanceof Exception) {
251 $causes[] = array(
'class' => get_class($this->cause),
252 'message' => $this->cause->getMessage(),
253 'file' => $this->cause->getFile(),
254 'line' => $this->cause->getLine());
255 } elseif (class_exists(
'PEAR_Error') && $this->cause instanceof
PEAR_Error) {
256 $causes[] = array(
'class' => get_class($this->cause),
257 'message' => $this->cause->getMessage(),
259 'line' =>
'unknown');
260 } elseif (is_array($this->cause)) {
261 foreach ($this->cause as
$cause) {
262 if ($cause instanceof PEAR_Exception) {
263 $cause->getCauseMessage($causes);
264 } elseif ($cause instanceof Exception) {
265 $causes[] = array(
'class' => get_class($cause),
266 'message' => $cause->getMessage(),
267 'file' => $cause->getFile(),
268 'line' => $cause->getLine());
269 } elseif (class_exists(
'PEAR_Error') && $cause instanceof PEAR_Error) {
270 $causes[] = array(
'class' => get_class($cause),
271 'message' => $cause->getMessage(),
273 'line' =>
'unknown');
274 } elseif (is_array($cause) && isset($cause[
'message'])) {
277 'class' => $cause[
'package'],
278 'message' => $cause[
'message'],
279 'file' => isset($cause[
'context'][
'file']) ?
280 $cause[
'context'][
'file'] :
282 'line' => isset($cause[
'context'][
'line']) ?
283 $cause[
'context'][
'line'] :
293 if (!isset($this->_trace)) {
294 $this->_trace = $this->getTrace();
295 if (empty($this->_trace)) {
296 $backtrace = debug_backtrace();
297 $this->_trace = array($backtrace[count($backtrace)-1]);
300 return $this->_trace;
306 return $trace[0][
'class'];
312 return $trace[0][
'function'];
317 if (isset($_SERVER[
'REQUEST_URI'])) {
328 $html =
'<table style="border: 1px" cellspacing="0">' .
"\n";
329 foreach ($causes as $i =>
$cause) {
330 $html .=
'<tr><td colspan="3" style="background: #ff9999">'
331 . str_repeat(
'-', $i) .
' <b>' .
$cause[
'class'] .
'</b>: '
332 . htmlspecialchars(
$cause[
'message']) .
' in <b>' .
$cause[
'file'] .
'</b> '
333 .
'on line <b>' .
$cause[
'line'] .
'</b>'
336 $html .=
'<tr><td colspan="3" style="background-color: #aaaaaa; text-align: center; font-weight: bold;">Exception trace</td></tr>' .
"\n"
337 .
'<tr><td style="text-align: center; background: #cccccc; width:20px; font-weight: bold;">#</td>'
338 .
'<td style="text-align: center; background: #cccccc; font-weight: bold;">Function</td>'
339 .
'<td style="text-align: center; background: #cccccc; font-weight: bold;">Location</td></tr>' .
"\n";
341 foreach ($trace as $k => $v) {
342 $html .=
'<tr><td style="text-align: center;">' . $k .
'</td>'
344 if (!empty($v[
'class'])) {
345 $html .= $v[
'class'] . $v[
'type'];
347 $html .= $v[
'function'];
349 if (!empty($v[
'args'])) {
350 foreach ($v[
'args'] as $arg) {
351 if (is_null($arg))
$args[] =
'null';
352 elseif (is_array($arg))
$args[] =
'Array';
353 elseif (is_object($arg))
$args[] =
'Object('.get_class($arg).
')';
354 elseif (is_bool($arg))
$args[] = $arg ?
'true' :
'false';
355 elseif (is_int($arg) || is_double($arg))
$args[] = $arg;
358 $str = htmlspecialchars(substr($arg, 0, 16));
359 if (strlen($arg) > 16) $str .=
'…';
360 $args[] =
"'" . $str .
"'";
364 $html .=
'(' . implode(
', ',
$args) .
')'
366 .
'<td>' . (isset($v[
'file']) ? $v[
'file'] :
'unknown')
367 .
':' . (isset($v[
'line']) ? $v[
'line'] :
'unknown')
368 .
'</td></tr>' .
"\n";
370 $html .=
'<tr><td style="text-align: center;">' . ($k+1) .
'</td>'
372 .
'<td> </td></tr>' .
"\n"
382 foreach ($causes as $i =>
$cause) {
383 $causeMsg .= str_repeat(
' ', $i) .
$cause[
'class'] .
': '
385 .
' on line ' .
$cause[
'line'] .
"\n";
387 return $causeMsg . $this->getTraceAsString();
static removeObserver($label= 'default')
__construct($message, $p2=null, $p3=null)
high class of message module
static addObserver($callback, $label= 'default')
getCauseMessage(&$causes)