ClanKiller.com
http://forums.clankiller.com/

PHP, classes, error_handlers and destructors
http://forums.clankiller.com/viewtopic.php?f=24&t=2479
Page 1 of 1

Author:  Satis [ Wed Aug 01, 2007 11:51 am ]
Post subject:  PHP, classes, error_handlers and destructors

heheh... I love my subject... but anyway....

in an attempt to make a script I'm writing more resilient I decided to add error handling. This is done with the set_error_handler function... however it's not class friendly, it'll only take a function. So here's how I set it up.

first I made the error handler function
[php]
function &trapError(){
static $error_Vals = array();
if (func_num_args()==5) { // Error Event has been passed
if(func_get_arg(0) == 8 || func_get_arg(1) == 'Only variables should be assigned by reference'){
return;
}
$error_Vals[] = array{
'no' => func_get_arg(0),
'text' => func_get_arg(1),
'file' => func_get_arg(2),
'line' => func_get_arg(3),
'vars'=>func_get_arg(4));
}
if (func_num_args()==0) { // Setup call. Return reference
return $error_Vals;
}
}
[/php]
this was ripped from php.net (user comments of the set_error_handler section) and mildly adapted. If 5 arguments are passed I set a static array that has all the warnings etc though I escape error numbers of 8 or errors whose text begin with "Only variables should be assigned by reference'. The first one is the one that complains if you use a var that doesn't exist, the second complains because of this function. If I call the function by itself it returns the array of accumulated errors.

The next thing was to set the error handler, so I did that in my constructor.
[php]
class whatever{
......
public function __construct(){
//set an error handler to catch warnings
$this->handler = set_error_handler('trapError');
}
[/php]

as the script executes it slowly accumulates warnings, errors, etc that aren't fatal. Any fatal error still bombs the script of course. If I want to I can pull the warnings up to this point by calling
[php]
$error_array = &trapError();
[/php]
which gives me the array of course. I then used my destructor to pull that array and write it all to a database.
[php]
public function __destruct(){
//get errors
$error_array = &trapError();
//write them to the script log
$i=0;
foreach($error_array as $err){
unset($vardump);
$no = $this->dbsafe($err['no']);
$text = $this->dbsafe($err['text']);
$file = $this->dbsafe($err['file']);
$line = $this->dbsafe($err['line']);
foreach($err['vars'] as $vars){
$vardump .= $this->dbsafe($vars);
}

$insert = "INSERT INTO newContentScriptLog
(err_no, err_text, err_file, err_line, err_vars)
VALUES
('$no','$text','$file',$line,'$vardump')";
$this->doquery($insert);
$i++;
if($i == 20){
//20 warnings is excessive... dump out in case I caught myself in a loop
break;
}
}
}
[/php]
notice the infinite loop escaper at the bottom. I ran into a situation where the inserts were causing warnings. I guess since I'm pulling the data by reference it was automatically appending itself to the array or something so it just looped infinitely.

Of course, once the data is in a database I can do all kinds of neat correlations with it.

Page 1 of 1 All times are UTC - 6 hours
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/