Edit report at https://bugs.php.net/bug.php?id=61091&edit=1
ID: 61091 Updated by: ras...@php.net Reported by: chealer at gmail dot com Summary: User-defined error handler run despite at sign (@) error control operator Status: Not a bug Type: Bug Package: *General Issues PHP Version: 5.3.10 Block user comment: N Private report: N New Comment: It says, "however you are still able to read the current value of error_reporting and act appropriately" followed by "Of particular note is that this value will be 0 if the statement that caused the error was prepended by the @ error-control operator." To me this says quite clearly that error_reporting will be 0 if the @ was used and that your custom error handler can read this value and "act appropriately." Previous Comments: ------------------------------------------------------------------------ [2012-02-19 19:49:22] chealer at gmail dot com Rasmus, the part you quoted is about error_reporting() settings, it merely mentions the error control operator. My question was, could you quote where "http://www.php.net/set_error_handler [...] explains that the user-defined error handler should check the error_reporting level in order to comply with the '@' if so desired"? ------------------------------------------------------------------------ [2012-02-15 16:53:06] ras...@php.net "error_reporting() settings will have no effect and your error handler will be called regardless - however you are still able to read the current value of error_reporting and act appropriately. Of particular note is that this value will be 0 if the statement that caused the error was prepended by the @ error-control operator." ------------------------------------------------------------------------ [2012-02-15 16:25:42] chealer at gmail dot com Thanks rasmus, but I do not see this explanation. Could you quote it? ------------------------------------------------------------------------ [2012-02-15 03:45:12] ras...@php.net This is very much by design and definitely won't be changed since that would break all sorts of code. It is also explicitly documented at http://www.php.net/set_error_handler which explains that the user-defined error handler should check the error_reporting level in order to comply with the '@' if so desired. ------------------------------------------------------------------------ [2012-02-15 03:06:15] chealer at gmail dot com Description: ------------ The at sign operator allows to "ignore" error messages, as explained in http://ca3.php.net/manual/en/language.operators.errorcontrol.php When prepended to an expression in PHP, any error messages that might be generated by that expression will be ignored. However, user-defined error handlers registered with set_error_handler() are nevertheless run when @ is used, which often causes such messages to show, as in the below example, where a custom error handler is used to customize the display of error messages. As http://ca3.php.net/manual/en/language.operators.errorcontrol.php#98895 and http://ca3.php.net/manual/en/language.operators.errorcontrol.php#85042 show, this problem is not new. This behavior appears to be by design, and might be wanted in some cases. Therefore, please either: Stop calling user-defined error handlers when suppressing errors. This needs serious consideration for backwards-compatibility. Allow specifying whether user-defined error handlers should be called when suppressing errors. Make the documentation reflect the current state of things. Test script: --------------- <?php function myErrorHandler($errno, $errstr) { switch ($errno) { case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Aborting...<br />\n"; exit(1); break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } } // function to test the error handling function scale_by_log($vect, $scale) { if (!is_numeric($scale) || $scale <= 0) { trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR); } if (!is_array($vect)) { trigger_error("Incorrect input vector, array of values expected", E_USER_WARNING); return null; } $temp = array(); foreach($vect as $pos => $value) { if (!is_numeric($value)) { trigger_error("Value at position $pos is not a number, using 0 (zero)", E_USER_NOTICE); $value = 0; } $temp[$pos] = log($scale) * $value; } return $temp; } $a = array(2, 3, "foo", 5.5, 43.3, 21.11); /* Value at position $pos is not a number, using 0 (zero) */ scale_by_log($a, M_PI); @scale_by_log($a, M_PI); set_error_handler("myErrorHandler"); @scale_by_log($a, M_PI); ?> Expected result: ---------------- Notice: Value at position 2 is not a number, using 0 (zero) in /var/www/atoperator.php on line 42 Call Stack: 0.0005 339192 1. {main}() /var/www/atoperator.php:0 0.0005 339836 2. scale_by_log(array (0 => 2, 1 => 3, 2 => 'foo', 3 => 5.5, 4 => 43.3, 5 => 21.11), 3.1415926535898) /var/www/atoperator.php:55 0.0006 340648 3. trigger_error('Value at position 2 is not a number, using 0 (zero)', 1024) /var/www/atoperator.php:42 Actual result: -------------- Notice: Value at position 2 is not a number, using 0 (zero) in /var/www/atoperator.php on line 42 Call Stack: 0.0005 339192 1. {main}() /var/www/atoperator.php:0 0.0005 339836 2. scale_by_log(array (0 => 2, 1 => 3, 2 => 'foo', 3 => 5.5, 4 => 43.3, 5 => 21.11), 3.1415926535898) /var/www/atoperator.php:55 0.0006 340648 3. trigger_error('Value at position 2 is not a number, using 0 (zero)', 1024) /var/www/atoperator.php:42 <b>My NOTICE</b> [1024] Value at position 2 is not a number, using 0 (zero)<br /> ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=61091&edit=1