madcitysw Posted January 3, 2009 Share Posted January 3, 2009 Well, I used the set_error_handler in the past, but now I having problems getting it to fire the callback function using this method: error_reporting(0); set_error_handler("myErrorHandler"); function myErrorHandler($errno, $errstr, $errfile, $errline) { print $errstr."aa"; } if (!file_exists("conf.php4") or !is_readable("conf.php4")) { print "ERROR: Unable to locate the conf file or it is unreadable "; exit; } else { include_once("conf.php4"); } if (!file_exists(_Path__Classes_Path."html.php4") or !is_readable(_Path__Classes_Path."html.php4")) { } else { if (!include_once(_Path__Classes_Path."html.php4")) { print "aww"; } if (!class_exists("CLASS_HANDLER")) { print "ehhe"; } } In the class html class, there a parsing error and it won't execute the myErrorHandler unless I change the following line to set_error_handler(myErrorHandler()), but then I get alot of other errors because it missing required vars to that function. I need a little help on this. I using PHP 5 Module with Apache on Windows. Thanks Quote Link to comment https://forums.phpfreaks.com/topic/139372-set_error_handler-problems/ Share on other sites More sharing options...
DarkWater Posted January 3, 2009 Share Posted January 3, 2009 What happens if you try to use the error handler with your html class thing that you're trying to load? Also, why are you using PHP4...? Quote Link to comment https://forums.phpfreaks.com/topic/139372-set_error_handler-problems/#findComment-728965 Share on other sites More sharing options...
madcitysw Posted January 3, 2009 Author Share Posted January 3, 2009 I not using PHP4, I using PHP5 as mention in the last post of mine. The Error Handler don't fire when it detects that there a parse syntax error in the html class. But if I take out the error_reporting, it reports like it normally would, but it still won't fire that callback. Quote Link to comment https://forums.phpfreaks.com/topic/139372-set_error_handler-problems/#findComment-728973 Share on other sites More sharing options...
DarkWater Posted January 3, 2009 Share Posted January 3, 2009 I'm fairly sure that parse errors are not handled by set_error_handler(). They're handled directly in the yacc grammar that PHP uses to parse your file. Quote Link to comment https://forums.phpfreaks.com/topic/139372-set_error_handler-problems/#findComment-728974 Share on other sites More sharing options...
madcitysw Posted January 3, 2009 Author Share Posted January 3, 2009 Um, I though I did this sometime in the past (like four years ago) and it was working then, but maybe not. It been a long time since I played with PHP. PS: I just tested a script that was in the php manual to see if it worked on the other errors and guess what, it still don't fire the callback. I used the following test: <?php // we will do our own error handling error_reporting(0); $old_error_handler = set_error_handler("userErrorHandler"); // user defined error handling function function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars) { // timestamp for the error entry $dt = date("Y-m-d H:i:s (T)"); // define an assoc array of error string // in reality the only entries we should // consider are E_WARNING, E_NOTICE, E_USER_ERROR, // E_USER_WARNING and E_USER_NOTICE $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 => 'Runtime Notice', E_RECOVERABLE_ERROR => 'Catchable Fatal Error' ); // set of errors for which a var trace will be saved $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE); $err = "<errorentry>\n"; $err .= "\t<datetime>" . $dt . "</datetime>\n"; $err .= "\t<errornum>" . $errno . "</errornum>\n"; $err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n"; $err .= "\t<errormsg>" . $errmsg . "</errormsg>\n"; $err .= "\t<scriptname>" . $filename . "</scriptname>\n"; $err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n"; if (in_array($errno, $user_errors)) { $err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n"; } $err .= "</errorentry>\n\n"; // for testing // echo $err; // save to the error log, and e-mail me if there is a critical user error error_log($err, 3, "/usr/local/php4/error.log"); if ($errno == E_USER_ERROR) { mail("[email protected]", "Critical User Error", $err); } } function distance($vect1, $vect2) { if (!is_array($vect1) || !is_array($vect2)) { trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR); return NULL; } if (count($vect1) != count($vect2)) { trigger_error("Vectors need to be of the same size", E_USER_ERROR); return NULL; } for ($i=0; $i<count($vect1); $i++) { $c1 = $vect1[$i]; $c2 = $vect2[$i]; $d = 0.0; if (!is_numeric($c1)) { trigger_error("Coordinate $i in vector 1 is not a number, using zero", E_USER_WARNING); $c1 = 0.0; } if (!is_numeric($c2)) { trigger_error("Coordinate $i in vector 2 is not a number, using zero", E_USER_WARNING); $c2 = 0.0; } $d += $c2*$c2 - $c1*$c1; } return sqrt($d); } // undefined constant, generates a warning $t = I_AM_NOT_DEFINED; // define some "vectors" $a = array(2, 3, "foo"); $b = array(5.5, 4.3, -1.6); $c = array(1, -3); // generate a user error $t1 = distance($c, $b) . "\n"; // generate another user error $t2 = distance($b, "i am not an array") . "\n"; // generate a warning $t3 = distance($a, $b) . "\n"; ?> So there something wrong with PHP or my settings in the conf file. Quote Link to comment https://forums.phpfreaks.com/topic/139372-set_error_handler-problems/#findComment-728976 Share on other sites More sharing options...
DarkWater Posted January 3, 2009 Share Posted January 3, 2009 I just went and looked through the PHP source, and it turns out that they get clever and actually do call any user defined error handlers for even parse errors. Your issue is that you're defining the function AFTER using it in the set_error_handler() call, as far as I can tell. P.S: If anyone is interested: void zenderror(char *error) { zend_error(E_PARSE, "%s", error); } Note: zenderror is the equivalent of yyerror #define yyerror zenderror Relevant parts of zend_error(): //...snip... /* Obtain relevant filename and lineno */ switch (type) { case E_CORE_ERROR: case E_CORE_WARNING: error_filename = NULL; error_lineno = 0; break; case E_PARSE: case E_COMPILE_ERROR: case E_COMPILE_WARNING: case E_ERROR: case E_NOTICE: case E_STRICT: case E_WARNING: case E_USER_ERROR: case E_USER_WARNING: case E_USER_NOTICE: case E_RECOVERABLE_ERROR: if (zend_is_compiling(TSRMLS_C)) { error_filename = zend_get_compiled_filename(TSRMLS_C); error_lineno = zend_get_compiled_lineno(TSRMLS_C); } else if (zend_is_executing(TSRMLS_C)) { error_filename = zend_get_executed_filename(TSRMLS_C); error_lineno = zend_get_executed_lineno(TSRMLS_C); } else { error_filename = NULL; error_lineno = 0; } break; default: error_filename = NULL; error_lineno = 0; break; } if (!error_filename) { error_filename = "Unknown"; } va_start(args, format); /* if we don't have a user defined error handler */ if (!EG(user_error_handler) || !(EG(user_error_handler_error_reporting) & type)) { zend_error_cb(type, error_filename, error_lineno, format, args); //...snip... Nice. Quote Link to comment https://forums.phpfreaks.com/topic/139372-set_error_handler-problems/#findComment-728982 Share on other sites More sharing options...
madcitysw Posted January 3, 2009 Author Share Posted January 3, 2009 Ya that what I though too, but it turns out it still don't fire even when I defined the function before calling the set_error_handler. Like this <?php function myErrorHandler($errno, $errstr, $errfile, $errline) { print $errstr."aa"; } error_reporting(0); set_error_handler("myErrorHandler"); if (!file_exists("conf.php4") or !is_readable("conf.php4")) { print "ERROR: Unable to locate the conf file or it is unreadable "; exit; } else { include_once("conf.php4"); } if (!file_exists(_Path__Classes_Path."html.php4") or !is_readable(_Path__Classes_Path."html.php4")) { } else { if (!include_once(_Path__Classes_Path."html.php4")) { print "aww"; } if (!class_exists("CLASS_HANDLER")) { print "ehhe"; } } ?> Quote Link to comment https://forums.phpfreaks.com/topic/139372-set_error_handler-problems/#findComment-728987 Share on other sites More sharing options...
DarkWater Posted January 3, 2009 Share Posted January 3, 2009 Actually, parse errors can't be trapped by any set_error_handler()'s because the functions aren't processed before syntax checking and stuff is done, it seems. Test script: <?php function myErrorHandler($errno, $errstr, $errfile, $errline) { print $errstr."aa"; } set_error_handler("myErrorHandler"); `touch foo_file`; //SYNTAX ERROR NEXT LINE :: 'foo_file' was not present in my working directory, so it doesn't seem to process until after it's all said and done. You should be checking for parse errors before running any live scripts (where error handling is important) anyway. P.S: Zend has the CODE to run any user defined error handler, even for E_PARSE, but it doesn't matter because you can't set an error handler UNTIL the script parses. Quote Link to comment https://forums.phpfreaks.com/topic/139372-set_error_handler-problems/#findComment-729002 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.