note 76900 added to function.set-error-handler
| From: | ash at osu1 dot php dot net | Date: | Sat, 04 Aug 2007 10:38:05 +0000 |
| Subject: | note 76900 added to function.set-error-handler | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-129172@lists.php.net to get a copy of this message | ||
error handling function that handles both errors and exceptions; also features a backtrace including
possible function arguments.
<?php
$cfg = array();
$cfg['debug'] = 1;
$cfg['adminEmail'] = 'name@domain.tld';
function errorHandler($errno, $errstr='', $errfile='', $errline='')
{
// if error has been supressed with an @
if (error_reporting() == 0) {
return;
}
global $cfg;
// check if function has been called by an exception
if(func_num_args() == 5) {
// called by trigger_error()
$exception = null;
list($errno, $errstr, $errfile, $errline) = func_get_args();
$backtrace = array_reverse(debug_backtrace());
}else {
// caught exception
$exc = func_get_arg(0);
$errno = $exc->getCode();
$errstr = $exc->getMessage();
$errfile = $exc->getFile();
$errline = $exc->getLine();
$backtrace = $exc->getTrace();
}
$errorType = array (
E_ERROR => 'ERROR',
E_WARNING => 'WARNING',
E_PARSE => 'PARSING ERROR',
E_NOTICE => 'NOTICE',
E_CORE_ERROR => 'CORE ERROR',
E_CORE_WARNING => 'CORE WARNING',
E_COMPILE_ERROR => 'COMPILE ERROR',
E_COMPILE_WARNING => 'COMPILE WARNING',
E_USER_ERROR => 'USER ERROR',
E_USER_WARNING => 'USER WARNING',
E_USER_NOTICE => 'USER NOTICE',
E_STRICT => 'STRICT NOTICE',
E_RECOVERABLE_ERROR => 'RECOVERABLE ERROR'
);
// create error message
if (array_key_exists($errno, $errorType)) {
$err = $errorType[$errno];
} else {
$err = 'CAUGHT EXCEPTION';
}
$errMsg = "$err: $errstr in $errfile on line $errline";
// start backtrace
foreach ($backtrace as $v) {
if (isset($v['class'])) {
$trace = 'in class
'.$v['class'].'::'.$v['function'].'(';
if (isset($v['args'])) {
$separator = '';
foreach($v['args'] as $arg ) {
$trace .= "$separator".getArgument($arg);
$separator = ', ';
}
}
$trace .= ')';
}
elseif (isset($v['function']) && empty($trace)) {
$trace = 'in function '.$v['function'].'(';
if (!empty($v['args'])) {
$separator = '';
foreach($v['args'] as $arg ) {
$trace .= "$separator".getArgument($arg);
$separator = ', ';
}
}
$trace .= ')';
}
}
// display error msg, if debug is enabled
if($cfg['debug'] == 1) {
echo '<h2>Debug Msg</h2>'.nl2br($errMsg).'<br />
Trace: '.nl2br($trace).'<br />';
}
// what to do
switch ($errno) {
case E_NOTICE:
case E_USER_NOTICE:
return;
break;
default:
if($cfg['debug'] == 0){
// send email to admin
if(!empty($cfg['adminEmail'])) {
@mail($cfg['adminEmail'],'critical error on
'.$_SERVER['HTTP_HOST'], $errorText,
'From: Error Handler');
}
// end and display error msg
exit(displayClientMessage());
}
else
exit('<p>aborting.</p>');
break;
}
} // end of errorHandler()
function displayClientMessage()
{
echo 'some html page with error message';
}
function getArgument($arg)
{
switch (strtolower(gettype($arg))) {
case 'string':
return( '"'.str_replace( array("\n"), array(''), $arg
).'"' );
case 'boolean':
return (bool)$arg;
case 'object':
return 'object('.get_class($arg).')';
case 'array':
$ret = 'array(';
$separtor = '';
foreach ($arg as $k => $v) {
$ret .= $separtor.getArgument($k).' => '.getArgument($v);
$separtor = ', ';
}
$ret .= ')';
return $ret;
case 'resource':
return 'resource('.get_resource_type($arg).')';
default:
return var_export($arg, true);
}
}
?>
----
Server IP: 69.147.83.197
Probable Submitter: 91.19.8.1
----
Manual Page -- http://www.php.net/manual/en/function.set-error-handler.php
Edit -- https://master.php.net/note/edit/76900
Del: integrated -- https://master.php.net/note/delete/76900/integrated
Del: useless -- https://master.php.net/note/delete/76900/useless
Del: bad code -- https://master.php.net/note/delete/76900/bad+code
Del: spam -- https://master.php.net/note/delete/76900/spam
Del: non-english -- https://master.php.net/note/delete/76900/non-english
Del: in docs -- https://master.php.net/note/delete/76900/in+docs
Del: other reasons-- https://master.php.net/note/delete/76900
Reject -- https://master.php.net/note/reject/76900
Search -- https://master.php.net/manage/user-notes.php