Jump to content

Recommended Posts

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

 

Link to comment
https://forums.phpfreaks.com/topic/139372-set_error_handler-problems/
Share on other sites

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.

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.

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.

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";
}
}

?>

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.

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.