Error Stack Log::composite
Overview
This example will show you how to logs HTML_Progress2 errors
though PEAR::Log composite driver with PEAR_ErrorStack.
Exceptions will be catched and script won't die anymore, so line 157 will be reached !
Screenshot
Critical:
invalid input, parameter #3 "$min" was expecting "integer", instead got "string"
[in [path_to]\errorstacklogger.php on line 127]
html_progress2_errorstack (0)
invalid input, parameter #3 "$min" was expecting "integer", instead got "string"
[in [path_to]\errorstacklogger.php on line 127]
Error: : invalid input, parameter #1 "$min" was expecting "positive", instead got "-1"
File: [path_to]\errorstacklogger.php Line: 152
Critical: : invalid input, parameter #1 "$continuous" was expecting "boolean", instead got "string"
File: [path_to]\errorstacklogger.php Line: 155
still alive !
Demonstration
For security reasons live demo is not available
and i've replaced the real path to file errorstacklogger.php by [path_to].
But in real conditions, you will see it!
Dependencies
This example requires mandatory resources :
Explains step by step
On example A, all errors will be proceed by the user callback
HTML_Progress2_ErrorStack::push (lines 122,124),
class declared on lines 16-107.
Resource (line 12), HTML_Progress2_Error class, is only necessary and used to
get HTML_Progress2 error message templates (line 21).
To avoid a wrong context frame (which should always returns line 46),
a new context callback was declared (lines 24,
86-95).
Beautify error message is made by new message callback (lines 23,
53-84) that overload the
default PEAR_ErrorStack::getErrorMessage.
To catch exception and avoid script to halt (default behaviour), a new local error callback
was declared (lines 40, 97-106).
If you want to restore default behaviour, you've just to set value of
variable $halt_onException (line 117) to true.
Because PEAR_ErrorStack as no logger defined by default, we set our own (lines 26-39).
Its goals are only to print error message on browser screen (lines 30-33),
through PEAR::Log display driver, and send the same error message on file 'html_progress2_err.log'
through PEAR::Log file driver (lines 26-28).
See also :
On example B, all errors are still proceed by the user callback
HTML_Progress2_ErrorStack::push (lines 122,
145).
As we also want to beautify message render, we changed the default display driver options
(lines 139-143) activated on line 146.
Option | Value | Default |
error_handler | HTML_Progress2_ErrorStack::push | HTML_Progress2::_errorHandler |
handler | display = array([1]) | display = array([2]) |
Custom options of display handler:
display [1] | Value |
lineFormat | <b>%1\$s</b>: %2\$s<br/>%3\$s<hr/> |
contextFormat |
<b>File:</b> %1\$s <br/>
<b>Line:</b> %2\$s |
Default options of display handler (lines 59-60):
display [2] | Value |
lineFormat | %1\$s %2\$s [%3\$s] |
contextFormat | in %1\$s on line %2\$s |
Source Code
<?php
/**
* Customize error renderer with PEAR_ErrorStack and PEAR::Log.
*
* @version $Id: errorstacklogger.php,v 1.1 2005/06/12 21:03:04 farell Exp $
* @author Laurent Laville <pear@laurent-laville.org>
* @package HTML_Progress2
* @subpackage Examples
* @access public
*/
require_once 'HTML/Progress2.php';
require_once 'HTML/Progress2/Error.php';
require_once 'PEAR/ErrorStack.php';
require_once 'Log.php';
class HTML_Progress2_ErrorStack
{
function HTML_Progress2_ErrorStack()
{
$s = &PEAR_ErrorStack::singleton('HTML_Progress2');
$t = HTML_Progress2_Error::_getErrorMessage();
$s->setErrorMessageTemplate($t);
$s->setMessageCallback(array(&$this,'getMessage'));
$s->setContextCallback(array(&$this,'getBacktrace'));
$ident = $_SERVER['REMOTE_ADDR'];
$conf = array('lineFormat' => '%1$s - %2$s [%3$s] %4$s');
$file = &Log::singleton('file', 'html_progress2_err.log', $ident, $conf);
$conf = array('error_prepend' => '<font color="#ff0000"><tt>',
'error_append' => '</tt></font>'
);
$display = &Log::singleton('display', '', '', $conf);
$composite = &Log::singleton('composite');
$composite->addChild($display);
$composite->addChild($file);
$s->setLogger($composite);
$s->pushCallback(array(&$this,'errorHandler'));
}
function push($code, $level, $params)
{
$s = &PEAR_ErrorStack::singleton('HTML_Progress2');
return $s->push($code, $level, $params);
}
/**
* default ErrorStack message callback is
* PEAR_ErrorStack::getErrorMessage()
*/
function getMessage(&$stack, $err, $template = false)
{
global $prefs;
$message = $stack->getErrorMessage($stack, $err, $template);
$lineFormat = '%1$s %2$s [%3$s]';
$contextFormat = 'in %1$s on line %2$s';
if (isset($prefs['handler']['display']['lineFormat'])) {
$lineFormat = $prefs['handler']['display']['lineFormat'];
$lineFormat = strip_tags($lineFormat);
}
if (isset($prefs['handler']['display']['contextFormat'])) {
$contextFormat = $prefs['handler']['display']['contextFormat'];
$contextFormat = strip_tags($contextFormat);
}
$context = $err['context'];
if ($context) {
$file = $context['file'];
$line = $context['line'];
$contextExec = sprintf($contextFormat, $file, $line);
} else {
$contextExec = '';
}
$msg = sprintf($lineFormat, '', $message, $contextExec);
return trim($msg);
}
function getBacktrace()
{
if (function_exists('debug_backtrace')) {
$backtrace = debug_backtrace();
$backtrace = $backtrace[count($backtrace)-1];
} else {
$backtrace = false;
}
return $backtrace;
}
function errorHandler($err)
{
global $halt_onException;
if ($halt_onException) {
if ($err['level'] == 'exception') {
return PEAR_ERRORSTACK_DIE;
}
}
}
}
function dump($title, $e)
{
echo "<h1> $title </h1>";
print_r($e['message']);
echo '<br/>';
}
// set it to on if you want to halt script on any exception
$halt_onException = false;
// Example A. ---------------------------------------------
$stack =& new HTML_Progress2_ErrorStack();
$prefs = array('error_handler' => array(&$stack, 'push'));
// A1. Exception
$pb1 = new HTML_Progress2($prefs, HTML_PROGRESS2_BAR_VERTICAL, '0', 130);
$countErrors = $pb1->hasErrors();
for ($i=0; $i<$countErrors; $i++) {
$e = $pb1->getError();
dump('html_progress2_errorstack ('.$i.')', $e);
}
// Example B. ---------------------------------------------
$displayConfig = array(
'lineFormat' => '<b>%1$s</b>: %2$s<br/>%3$s<hr/>',
'contextFormat' => '<b>File:</b> %1$s <br/>'
. '<b>Line:</b> %2$s '
);
$prefs = array(
'error_handler' => array(&$stack, 'push'),
'handler' => array('display' => $displayConfig)
);
$pb2 = new HTML_Progress2($prefs);
// B1. Error
$pb2->setMinimum(-1);
// B2. Exception
$pb2->setIndeterminate('true');
print 'still alive !';
?>